﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОписаниеПеременных

&НаКлиенте
Перем ПолучательПеретаскиваемогоЗначения, АдресПараметровДляОбработкиОжидания;

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
		ВызватьИсключение НСтр("ru = 'Редактирование табличного документа недоступно в мобильном клиенте.
		|Используйте тонкий клиент или веб-клиент.'");
	КонецЕсли;
	
	Если Параметры.РежимОткрытияОкна <> Неопределено Тогда
		РежимОткрытияОкна = Параметры.РежимОткрытияОкна;
	КонецЕсли;

	ТабличныйДокумент.КодЯзыка = ОбщегоНазначения.КодОсновногоЯзыка();
	ТабличныйДокумент.Макет = Истина;
	
	ИдентификаторМакета = Параметры.ИмяОбъектаМетаданныхМакета;
	СсылкаМакета = Параметры.Ссылка;
	Если ЗначениеЗаполнено(СсылкаМакета) Тогда
		КлючОбъектаРедактирования  = СсылкаМакета;
		ЗаблокироватьДанныеДляРедактирования(КлючОбъектаРедактирования,,УникальныйИдентификатор);
	ИначеЕсли ЗначениеЗаполнено(ИдентификаторМакета) Тогда
		Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
			МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
			КлючОбъектаРедактирования = МодульУправлениеПечатью.ПолучитьКлючЗаписиМакета(ИдентификаторМакета);
			Если КлючОбъектаРедактирования <> Неопределено Тогда
				ЗаблокироватьДанныеДляРедактирования(КлючОбъектаРедактирования,,УникальныйИдентификатор);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	ЭтоПечатнаяФорма = Параметры.ЭтоПечатнаяФорма;
	ЭтоМакет = Не ПустаяСтрока(ИдентификаторМакета) Или ЭтоПечатнаяФорма;
	
	Если ЭтоМакет Тогда
		Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
			МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
			ИсточникиДанныхМакета = МодульУправлениеПечатью.ИсточникиДанныхМакета(ИдентификаторМакета);
			Для Каждого ИсточникДанных Из ИсточникиДанныхМакета Цикл
				ИсточникиДанных.Добавить(ИсточникДанных);
			КонецЦикла;
		КонецЕсли;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(Параметры.ИсточникДанных) Тогда
		Если Не ЗначениеЗаполнено(ИсточникиДанных) Тогда
			ИсточникиДанных.Добавить(Параметры.ИсточникДанных);
		КонецЕсли;
	КонецЕсли;
	Элементы.ТекстНазначение.Заголовок = ПредставлениеИсточниковДанных(ИсточникиДанных);
	
	ИмяДокумента = Параметры.ИмяДокумента;
	Элементы.Переименовать.Видимость = ЗначениеЗаполнено(Параметры.Ссылка) 
		Или ПустаяСтрока(ИдентификаторМакета) И ПустаяСтрока(Параметры.ПутьКФайлу);
	
	Элементы.УдалитьЯзыкМакета.Видимость = Не ЗначениеЗаполнено(Параметры.Ссылка) И ПустаяСтрока(Параметры.ПутьКФайлу);

	Если Параметры.ТабличныйДокумент = Неопределено Тогда
		Если Не ПустаяСтрока(ИдентификаторМакета) Тогда
			РедактированиеЗапрещено = Не Параметры.Редактирование;
			ЗагрузитьТабличныйДокументИзМетаданных(Параметры.КодЯзыка);
			Если Параметры.Копирование Тогда
				ИдентификаторКопируемогоМакета = ИдентификаторМакета;
				ИдентификаторМакета = "";
			КонецЕсли;
		КонецЕсли;
	ИначеЕсли ТипЗнч(Параметры.ТабличныйДокумент) = Тип("ТабличныйДокумент") Тогда
		ЗаполнитьТабличныйДокумент(ТабличныйДокумент, Параметры.ТабличныйДокумент);
	Иначе
		ТабличныйДокумент.КодЯзыка = Неопределено;
		ДвоичныеДанные = ПолучитьИзВременногоХранилища(Параметры.ТабличныйДокумент); // ДвоичныеДанные - 
		ИмяВременногоФайла = ПолучитьИмяВременногоФайла("mxl");
		ДвоичныеДанные.Записать(ИмяВременногоФайла);
		ТабличныйДокумент.Прочитать(ИмяВременногоФайла);
		УдалитьФайлы(ИмяВременногоФайла);
	КонецЕсли;
	
	Элементы.ТабличныйДокумент.Редактирование = Параметры.Редактирование;
	Элементы.ТабличныйДокумент.ОтображатьГруппировки = Истина;
	Элементы.ТабличныйДокумент.ОтображатьИменаСтрокИКолонок = ТабличныйДокумент.Макет;
	Элементы.ТабличныйДокумент.ОтображатьИменаЯчеек = ТабличныйДокумент.Макет;
	
	Элементы.Предупреждение.Видимость = ЭтоМакет И Не ЭтоПечатнаяФорма И Параметры.Редактирование;
	Элементы.РедактироватьВоВнешнейПрограмме.Видимость = ОбщегоНазначения.ЭтоВебКлиент() 
		И Не ПустаяСтрока(ИдентификаторМакета) И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать");
	
	ДоступенПереводМакета = Ложь;
	Если ЭтоМакет Тогда
		Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда
			МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность");
			ДоступенПереводМакета = МодульУправлениеПечатьюМультиязычность.ДоступенПереводМакета(ИдентификаторМакета);
			Если ЭтоПечатнаяФорма Или МодульУправлениеПечатьюМультиязычность.ДоступенПереводМакета(ИдентификаторМакета) Тогда
				МодульУправлениеПечатьюМультиязычность.ЗаполнитьПодменюЯзык(ЭтотОбъект, Параметры.КодЯзыка);
				ДоступенАвтоматическийПеревод = МодульУправлениеПечатьюМультиязычность.ДоступенАвтоматическийПеревод(ТекущийЯзык);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Элементы.Язык.Доступность = (ЭтоПечатнаяФорма Или ДоступенПереводМакета) И ЗначениеЗаполнено(ИдентификаторМакета);
	
	Элементы.Перевести.Видимость = ДоступенАвтоматическийПеревод;
	
	Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
		ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "КоманднаяПанель", "Видимость", Ложь);
		ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "Предупреждение", "Видимость", Ложь);
	КонецЕсли;
	
	Если ЭтоПечатнаяФорма И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда
		МодульКонструкторФормул = ОбщегоНазначения.ОбщийМодуль("КонструкторФормул");
		
		ИсточникДанных = Параметры.ИсточникДанных;
		Если Не ЗначениеЗаполнено(Параметры.ИсточникДанных) Тогда
			ИсточникДанных = ИсточникиДанных[0].Значение;
		КонецЕсли;

		ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(ИсточникДанных);
		ПодобратьОбразец(ОбъектМетаданных);
		
		Элементы.Редактирование.Видимость = Ложь;
		ЦветФонаВыделенияПоля = ЦветаСтиля.ЦветНавигации;
		
		Элементы.ТекстДляКопирования.Видимость = ОбщегоНазначения.ЭтоВебКлиент();
		
		ПараметрыДобавления = МодульКонструкторФормул.ПараметрыДобавленияСпискаПолей();
		ПараметрыДобавления.ИмяСписка = ИмяСпискаПолей();
		ПараметрыДобавления.МестоРазмещенияСписка = Элементы.ГруппаДоступныеПоля;
		ПараметрыДобавления.КоллекцииПолей = КоллекцииПолей(ИсточникиДанных.ВыгрузитьЗначения(), ПараметрыРедактирования());
		ПараметрыДобавления.ПодсказкаВводаСтрокиПоиска = ПодсказкаВводаСтрокиПоискаСпискаПолей();
		ПараметрыДобавления.ПриОпределенииИсточниковДоступныхПолей = "УправлениеПечатью";
		ПараметрыДобавления.ОбработчикиСписка.Вставить("Выбор", "Подключаемый_СписокПолейВыбор");
		ПараметрыДобавления.ОбработчикиСписка.Вставить("ПередНачаломИзменения", "Подключаемый_ДоступныеПоляПередНачаломИзменения");
		ПараметрыДобавления.ОбработчикиСписка.Вставить("ПриОкончанииРедактирования", "Подключаемый_ДоступныеПоляПриОкончанииРедактирования");
		ПараметрыДобавления.ИспользоватьФоновыйПоиск = Истина;
		
		МодульКонструкторФормул.ДобавитьСписокПолейНаФорму(ЭтотОбъект, ПараметрыДобавления);
				
		ПараметрыДобавления = МодульКонструкторФормул.ПараметрыДобавленияСпискаПолей();
		ПараметрыДобавления.ИмяСписка = ИмяСпискаОператоров();
		ПараметрыДобавления.МестоРазмещенияСписка = Элементы.ГруппаОператорыИФункции;
		ПараметрыДобавления.КоллекцииПолей.Добавить(СписокОператоров());			
		ПараметрыДобавления.ПодсказкаВводаСтрокиПоиска = НСтр("ru = 'Найти оператор или функцию...'");
		ПараметрыДобавления.СкобкиПредставлений = Ложь;
		ПараметрыДобавления.ОбработчикиСписка.Вставить("Выбор", "Подключаемый_СписокПолейВыбор");
		ПараметрыДобавления.ОбработчикиСписка.Вставить("НачалоПеретаскивания", "Подключаемый_ОператорыНачалоПеретаскивания");
		ПараметрыДобавления.ОбработчикиСписка.Вставить("ОкончаниеПеретаскивания", "Подключаемый_ОператорыОкончаниеПеретаскивания");
		
		МодульКонструкторФормул.ДобавитьСписокПолейНаФорму(ЭтотОбъект, ПараметрыДобавления);
		
		ЗаполнитьТабличныйДокумент(ТабличныйДокумент, ПрочитатьМакет());
		ПрочитатьТекстВПолеКолонтитула(ТабличныйДокумент.ВерхнийКолонтитул.ТекстСлева, ТекстСлеваСверху);
		ПрочитатьТекстВПолеКолонтитула(ТабличныйДокумент.ВерхнийКолонтитул.ТекстВЦентре, ТекстВЦентреСверху);
		ПрочитатьТекстВПолеКолонтитула(ТабличныйДокумент.ВерхнийКолонтитул.ТекстСправа, ТекстСправаСверху);
		ПрочитатьТекстВПолеКолонтитула(ТабличныйДокумент.НижнийКолонтитул.ТекстСлева, ТекстСлеваСнизу);
		ПрочитатьТекстВПолеКолонтитула(ТабличныйДокумент.НижнийКолонтитул.ТекстВЦентре, ТекстВЦентреСнизу);
		ПрочитатьТекстВПолеКолонтитула(ТабличныйДокумент.НижнийКолонтитул.ТекстСправа, ТекстСправаСнизу);
	
		РасширитьСписокПолей();
		
		ТабличныйДокумент.Макет = Истина;
		
		Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда
			МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный");
			ТипыПрисоединенныхФайлов = МодульРаботаСФайламиСлужебный.ТипыПрисоединенныхФайлов();
		КонецЕсли;
	КонецЕсли;
	
	Если Не ЭтоПечатнаяФорма Тогда
		Элементы.ПоказыватьКолонтитулы.Видимость = Ложь;
		Элементы.НастройкиТекущейОбласти.Видимость = Ложь;
		Элементы.КнопкаДоступныеПоля.Видимость = Ложь;
		Элементы.ПосмотретьПечатнуюФорму.Видимость = Ложь;
		Элементы.ПовторятьВНачалеСтраницы.Видимость = Ложь;
		Элементы.ПовторятьВКонцеСтраницы.Видимость = Ложь;
	КонецЕсли;
	
	Элементы.ВерхнийКолонтитул.Видимость = Ложь;
	Элементы.НижнийКолонтитул.Видимость = Ложь;

	Элементы.ГруппаНазначениеМакета.Видимость = ЭтоПечатнаяФорма;
	Элементы.ГруппаНазначениеМакета.Доступность = Параметры.ДоступноНазначение;
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	Если Не ПустаяСтрока(Параметры.ПутьКФайлу) Тогда
		Файл = Новый Файл(Параметры.ПутьКФайлу);
		Если ПустаяСтрока(ИмяДокумента) Тогда
			ИмяДокумента = Файл.ИмяБезРасширения;
		КонецЕсли;
		Файл.НачатьПолучениеТолькоЧтения(Новый ОписаниеОповещения("ПриЗавершенииПолученияТолькоЧтения", ЭтотОбъект));
		Возврат;
	КонецЕсли;
	
	УстановитьНачальныеНастройкиФормы();
	
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
	
	Если Элементы.ПосмотретьПечатнуюФорму.Пометка Тогда
		Отказ = Истина;
		ПосмотретьПечатнуюФорму(Неопределено);
		Возврат;
	КонецЕсли;
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ПодтвердитьИЗакрыть", ЭтотОбъект);
	ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Сохранить изменения в %1?'"), ИмяДокумента);
	ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(ОписаниеОповещения, Отказ, ЗавершениеРаботы, ТекстВопроса);
	
	Если Модифицированность Или ЗавершениеРаботы Тогда
		Возврат;
	КонецЕсли;
	
	Если Не ЭтоНовый() Тогда
		ОповеститьОЗаписиТабличногоДокумента();
	КонецЕсли;
	
	Если  Не Отказ И Не ЗавершениеРаботы И ЗначениеЗаполнено(КлючОбъектаРедактирования) Тогда
		РазблокироватьНаСервере(); 
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПодтвердитьИЗакрыть(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт
	ОписаниеОповещения = Новый ОписаниеОповещения("ЗакрытьФормуПослеЗаписиТабличногоДокумента", ЭтотОбъект);
	ЗаписатьТабличныйДокумент(ОписаниеОповещения);
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	Если ИмяСобытия = "ЗапросИменРедактируемыхТабличныхДокументов" И Источник <> ЭтотОбъект Тогда
		ИменаДокументов = Параметр; // Массив -
		ИменаДокументов.Добавить(ИмяДокумента);
	ИначеЕсли ИмяСобытия = "ЗакрытиеФормыВладельца" И Источник = ВладелецФормы Тогда
		Закрыть();
		Если Открыта() Тогда
			Параметр.Отказ = Истина;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ТабличныйДокументПриАктивизации(Элемент)
	ОбновитьПометкиКнопокКоманднойПанели();
	СинхронизироватьОбластьПросмотраМакетов();
	ПодключитьОбработчикОжидания("ОчиститьПодсветку", 0.1, Истина);
	ПодключитьОбработчикОжидания("ОбновитьОбластьНастройкиВыбранныхЯчеек", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ПоставляемыйМакетПриАктивизации(Элемент)
	
	СинхронизироватьОбластьПросмотраМакетов();
	
КонецПроцедуры

&НаКлиенте
Процедура ВладельцыМакетаНажатие(Элемент)
	
	ПараметрыПодбора = Новый Структура;
	ПараметрыПодбора.Вставить("ВыбранныеОбъектыМетаданных", ОбщегоНазначенияКлиент.СкопироватьРекурсивно(ИсточникиДанных));
	ПараметрыПодбора.Вставить("ВыбиратьСсылки", Истина);
	ПараметрыПодбора.Вставить("Заголовок", НСтр("ru = 'Назначение макета'"));
	ПараметрыПодбора.Вставить("ФильтрПоОбъектамМетаданных", ОбъектыСКомандамиПечати());
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ПриВыбореВладельцевМакета", ЭтотОбъект);
	ОткрытьФорму("ОбщаяФорма.ВыборОбъектовМетаданных", ПараметрыПодбора, , , , , ОписаниеОповещения);

КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

// Действия с документом

&НаКлиенте
Процедура ЗаписатьИЗакрыть(Команда)
	ОписаниеОповещения = Новый ОписаниеОповещения("ЗакрытьФормуПослеЗаписиТабличногоДокумента", ЭтотОбъект);
	ЗаписатьТабличныйДокумент(ОписаниеОповещения, Истина);
КонецПроцедуры

&НаКлиенте
Процедура Записать(Команда)
	ЗаписатьТабличныйДокумент();
	ОповеститьОЗаписиТабличногоДокумента();
КонецПроцедуры

&НаКлиенте
Процедура Редактирование(Команда)
	Элементы.ТабличныйДокумент.Редактирование = Не Элементы.ТабличныйДокумент.Редактирование;
	НастроитьПредставлениеКоманд();
	НастроитьОтображениеТабличногоДокумента();
КонецПроцедуры

&НаКлиенте
Процедура РедактироватьВоВнешнейПрограмме(Команда)
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		ПараметрыОткрытия = Новый Структура;
		ПараметрыОткрытия.Вставить("ТабличныйДокумент", ТабличныйДокумент);
		ПараметрыОткрытия.Вставить("ИмяОбъектаМетаданныхМакета", ИдентификаторМакета);
		ПараметрыОткрытия.Вставить("ИдентификаторМакета", ИдентификаторМакета);
		ПараметрыОткрытия.Вставить("ТипМакета", "MXL");
		ОписаниеОповещения = Новый ОписаниеОповещения("РедактироватьВоВнешнейПрограммеЗавершение", ЭтотОбъект);
		МодульУправлениеПечатьюКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеПечатьюКлиент");
		МодульУправлениеПечатьюКлиент.РедактироватьМакетВоВнешнейПрограмме(ОписаниеОповещения, ПараметрыОткрытия, ЭтотОбъект);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура СохранитьВФайл(Команда)
	
	ОчиститьПодсветку();
	
	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	ДиалогВыбораФайла.ПолноеИмяФайла = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ИмяДокумента);
	ДиалогВыбораФайла.Фильтр = НСтр("ru = 'Табличный документ'") + " (*.mxl)|*.mxl";
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ПродолжитьСохранениеВФайл", ЭтотОбъект);
	ФайловаяСистемаКлиент.ПоказатьДиалогВыбора(ОписаниеОповещения, ДиалогВыбораФайла);	
	
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьИзФайла(Команда)
	
	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	ДиалогВыбораФайла.Фильтр = НСтр("ru = 'Табличный документ'") + " (*.mxl)|*.mxl";
	ДиалогВыбораФайла.МножественныйВыбор = Ложь;
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ПродолжитьЗагрузкуИзФайла", ЭтотОбъект);
	ФайловаяСистемаКлиент.ПоказатьДиалогВыбора(ОписаниеОповещения, ДиалогВыбораФайла);	
	
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьШрифт(Команда)
	
	Если Элементы.ТабличныйДокумент.ТекущаяОбласть = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ИзменитьШрифтПродолжение", ЭтотОбъект);
	ОткрытьФорму("ОбщаяФорма.ФормаВыбораШрифта",, ЭтотОбъект,,,, ОписаниеОповещения);
	
КонецПроцедуры

// Форматирование

&НаКлиенте
Процедура УвеличитьРазмерШрифта(Команда)
	
	Для Каждого Область Из СписокОбластейДляИзмененияШрифта() Цикл
		Размер = Область.Шрифт.Размер;
		Размер = Размер + ШагИзмененияРазмераШрифтаУвеличение(Размер);
		Область.Шрифт = Новый Шрифт(Область.Шрифт,,Размер); // АПК:1345 - Применение стиля не требуется.
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура УменьшитьРазмерШрифта(Команда)
	
	Для Каждого Область Из СписокОбластейДляИзмененияШрифта() Цикл
		Размер = Область.Шрифт.Размер;
		Размер = Размер - ШагИзмененияРазмераШрифтаУменьшение(Размер);
		Если Размер < 1 Тогда
			Размер = 1;
		КонецЕсли;
		Область.Шрифт = Новый Шрифт(Область.Шрифт,,Размер); // АПК:1345 - Применение стиля не требуется.
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура Зачеркивание(Команда)
	
	УстанавливаемоеЗначение = Неопределено;
	Для Каждого Область Из СписокОбластейДляИзмененияШрифта() Цикл
		Если УстанавливаемоеЗначение = Неопределено Тогда
			УстанавливаемоеЗначение = Не Область.Шрифт.Зачеркивание = Истина;
		КонецЕсли;
		Область.Шрифт = Новый Шрифт(Область.Шрифт,,,,,,УстанавливаемоеЗначение); // АПК:1345 - Применение стиля не требуется.
	КонецЦикла;
	
	ОбновитьПометкиКнопокКоманднойПанели();
	
КонецПроцедуры

&НаКлиенте
Процедура Перевести(Команда)
	
	ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Выполнить автоматический перевод на %1 язык?'"), Элементы.Язык.Заголовок);
	Кнопки = Новый СписокЗначений;
	Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Выполнить перевод'"));
	Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Не выполнять'"));
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ПриОтветеНаВопросОПереводеМакета", ЭтотОбъект);
	ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, Кнопки);
	
КонецПроцедуры

&НаКлиенте
Процедура ТекстСлеваСверхуПриИзменении(Элемент)
	
	ТабличныйДокумент.ВерхнийКолонтитул.ТекстСлева = ТекстСлеваСверху.ПолучитьФорматированнуюСтроку();
	УстановитьВыводКолонтитула(ТабличныйДокумент.ВерхнийКолонтитул);
	Модифицированность = Истина;
	ПолучательПеретаскиваемогоЗначения = Элемент;
	
КонецПроцедуры

&НаКлиенте
Процедура ТекстВЦентреСверхуПриИзменении(Элемент)
	
	ТабличныйДокумент.ВерхнийКолонтитул.ТекстВЦентре = ТекстВЦентреСверху.ПолучитьФорматированнуюСтроку();
	УстановитьВыводКолонтитула(ТабличныйДокумент.ВерхнийКолонтитул);
	Модифицированность = Истина;
	ПолучательПеретаскиваемогоЗначения = Элемент;
	
КонецПроцедуры

&НаКлиенте
Процедура ТекстСправаСверхуПриИзменении(Элемент)
	
	ТабличныйДокумент.ВерхнийКолонтитул.ТекстСправа = ТекстСправаСверху.ПолучитьФорматированнуюСтроку();
	УстановитьВыводКолонтитула(ТабличныйДокумент.ВерхнийКолонтитул);
	Модифицированность = Истина;
	ПолучательПеретаскиваемогоЗначения = Элемент;
	
КонецПроцедуры

&НаКлиенте
Процедура ТекстСлеваСнизуПриИзменении(Элемент)
	
	ТабличныйДокумент.НижнийКолонтитул.ТекстСлева = ТекстСлеваСнизу.ПолучитьФорматированнуюСтроку();
	УстановитьВыводКолонтитула(ТабличныйДокумент.НижнийКолонтитул);
	Модифицированность = Истина;
	ПолучательПеретаскиваемогоЗначения = Элемент;
	
КонецПроцедуры

&НаКлиенте
Процедура ТекстВЦентреСнизуПриИзменении(Элемент)
	
	ТабличныйДокумент.НижнийКолонтитул.ТекстВЦентре = ТекстВЦентреСнизу.ПолучитьФорматированнуюСтроку();
	УстановитьВыводКолонтитула(ТабличныйДокумент.НижнийКолонтитул);
	Модифицированность = Истина;
	ПолучательПеретаскиваемогоЗначения = Элемент;
	
КонецПроцедуры

&НаКлиенте
Процедура ТекстСправаСнизуПриИзменении(Элемент)
	
	ТабличныйДокумент.НижнийКолонтитул.ТекстСправа = ТекстСправаСнизу.ПолучитьФорматированнуюСтроку();
	УстановитьВыводКолонтитула(ТабличныйДокумент.НижнийКолонтитул);
	Модифицированность = Истина;
	ПолучательПеретаскиваемогоЗначения = Элемент;
	
КонецПроцедуры

&НаКлиенте
Процедура ВыровнятьПоВерхнемуКраю(Команда)
	
	Для Каждого Область Из СписокОбластейДляИзмененияШрифта() Цикл
		Область.ВертикальноеПоложение = ВертикальноеПоложение.Верх;
	КонецЦикла;
	
	ОбновитьПометкиКнопокКоманднойПанели();
	
КонецПроцедуры

&НаКлиенте
Процедура ВыровнятьПоСередине(Команда)
	
	Для Каждого Область Из СписокОбластейДляИзмененияШрифта() Цикл
		Область.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
	КонецЦикла;
	
	ОбновитьПометкиКнопокКоманднойПанели();
	
КонецПроцедуры

&НаКлиенте
Процедура ВыровнятьПоНижнемуКраю(Команда)
	
	Для Каждого Область Из СписокОбластейДляИзмененияШрифта() Цикл
		Область.ВертикальноеПоложение = ВертикальноеПоложение.Низ;
	КонецЦикла;
	
	ОбновитьПометкиКнопокКоманднойПанели();
	
КонецПроцедуры

&НаКлиенте
Процедура Переименовать(Команда)
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ПриВыбореИмениМакета", ЭтотОбъект);
	ПоказатьВводСтроки(ОписаниеОповещения, ИмяДокумента, НСтр("ru = 'Введите наименование макета'"), 100, Ложь);
	
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьЦветГраницы(Команда)
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеИзменитьЦветГраницы", ЭтотОбъект);
	ОткрытьФорму("ОбщаяФорма.ФормаВыбораЦвета",, ЭтотОбъект,,,, ОписаниеОповещения);
	
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьЦветТекста(Команда)
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеИзменитьЦветТекста", ЭтотОбъект);
	ОткрытьФорму("ОбщаяФорма.ФормаВыбораЦвета",, ЭтотОбъект,,,, ОписаниеОповещения);
	
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьЦветФона(Команда)
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеИзменитьЦветФона", ЭтотОбъект);
	ОткрытьФорму("ОбщаяФорма.ФормаВыбораЦвета",, ЭтотОбъект,,,, ОписаниеОповещения);

КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаСервере
Процедура ЗагрузитьТабличныйДокументИзМетаданных(Знач КодЯзыка = Неопределено)
	
	ТребуетсяПеревод = Ложь;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
		МакетПечатнойФормы = МодульУправлениеПечатью.МакетПечатнойФормы(ИдентификаторМакета, КодЯзыка);
		ЗаполнитьТабличныйДокумент(ТабличныйДокумент, МакетПечатнойФормы);
		Если Не ЗначениеЗаполнено(СсылкаМакета) Тогда
			ПоставляемыйМакет = МодульУправлениеПечатью.ПоставляемыйМакет(ИдентификаторМакета, КодЯзыка);
		КонецЕсли;
	КонецЕсли;
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда
		МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность");
		Если ЗначениеЗаполнено(КодЯзыка) Тогда
			ДоступныеЯзыкиТабличногоДокумента = МодульУправлениеПечатьюМультиязычность.ЯзыкиМакета(ИдентификаторМакета);
			ТребуетсяПеревод = ДоступныеЯзыкиТабличногоДокумента.Найти(КодЯзыка) = Неопределено;
		КонецЕсли;
		
		Если КодЯзыка <> "" Тогда
			ЯзыкиМакета = МодульУправлениеПечатьюМультиязычность.ЯзыкиМакета(ИдентификаторМакета);
			Модифицированность = Модифицированность Или (ЯзыкиМакета.Найти(КодЯзыка) = Неопределено);
		КонецЕсли;
		
		ДоступенАвтоматическийПеревод = МодульУправлениеПечатьюМультиязычность.ДоступенАвтоматическийПеревод(ТекущийЯзык);
		Элементы.Перевести.Видимость = ДоступенАвтоматическийПеревод;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьВыводКолонтитула(Колонтитул)
	Колонтитул.Выводить = Не ПустаяСтрока(Колонтитул.ТекстСлева) Или Не ПустаяСтрока(Колонтитул.ТекстСправа) Или Не ПустаяСтрока(Колонтитул.ТекстВЦентре);
	Колонтитул.НачальнаяСтраница = 1;	
КонецПроцедуры

&НаКлиенте
Процедура НастроитьОтображениеТабличногоДокумента()
	Элементы.ТабличныйДокумент.ОтображатьЗаголовки = Элементы.ТабличныйДокумент.Редактирование;
	Элементы.ТабличныйДокумент.ОтображатьСетку = Элементы.ТабличныйДокумент.Редактирование;
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьПометкиКнопокКоманднойПанели();
	
#Если Не ВебКлиент И НЕ МобильныйКлиент Тогда
	Область = Элементы.ТабличныйДокумент.ТекущаяОбласть;
	Если ТипЗнч(Область) <> Тип("ОбластьЯчеекТабличногоДокумента") Тогда
		Возврат;
	КонецЕсли;
	
	// Шрифт
	Шрифт = Область.Шрифт;
	Элементы.ТабличныйДокументЖирный.Пометка = Шрифт <> Неопределено И Шрифт.Полужирный = Истина;
	Элементы.ТабличныйДокументНаклонный.Пометка = Шрифт <> Неопределено И Шрифт.Наклонный = Истина;
	Элементы.ТабличныйДокументПодчеркивание.Пометка = Шрифт <> Неопределено И Шрифт.Подчеркивание = Истина;
	
	Элементы.ТабличныйДокументПодчеркиваниеВсеДействия.Пометка = Элементы.ТабличныйДокументЖирный.Пометка;
	Элементы.ТабличныйДокументНаклонныйВсеДействия.Пометка = Элементы.ТабличныйДокументНаклонный.Пометка;
	Элементы.ТабличныйДокументПодчеркиваниеВсеДействия.Пометка = Элементы.ТабличныйДокументПодчеркивание.Пометка;
	Элементы.ЗачеркиваниеВсеДействия.Пометка = Шрифт <> Неопределено И Шрифт.Зачеркивание = Истина;
	
	// Горизонтальное положение
	Элементы.ТабличныйДокументВыровнятьВлево.Пометка = Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Лево;
	Элементы.ТабличныйДокументВыровнятьПоЦентру.Пометка = Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
	Элементы.ТабличныйДокументВыровнятьВправо.Пометка = Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Право;
	Элементы.ТабличныйДокументВыровнятьПоШирине.Пометка = Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.ПоШирине;
	
	Элементы.ТабличныйДокументВыровнятьВлевоВсеДействия.Пометка = Элементы.ТабличныйДокументВыровнятьВлево.Пометка;
	Элементы.ТабличныйДокументВыровнятьПоЦентруВсеДействия.Пометка = Элементы.ТабличныйДокументВыровнятьПоЦентру.Пометка;
	Элементы.ТабличныйДокументВыровнятьВправоВсеДействия.Пометка = Элементы.ТабличныйДокументВыровнятьВправо.Пометка;
	Элементы.ТабличныйДокументВыровнятьПоШиринеВсеДействия.Пометка = Элементы.ТабличныйДокументВыровнятьПоШирине.Пометка;
	
	// Вертикальное положение
	Элементы.ВыровнятьПоВерхнемуКраю.Пометка = Область.ВертикальноеПоложение = ВертикальноеПоложение.Верх;
	Элементы.ВыровнятьПоСередине.Пометка = Область.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
	Элементы.ВыровнятьПоНижнемуКраю.Пометка = Область.ВертикальноеПоложение = ВертикальноеПоложение.Низ;
	
	Элементы.ВыровнятьПоВерхнемуКраюВсеДействия.Пометка = Элементы.ВыровнятьПоВерхнемуКраю.Пометка;
	Элементы.ВыровнятьПоСерединеВсеДействия.Пометка = Элементы.ВыровнятьПоСередине.Пометка;
	Элементы.ВыровнятьПоНижнемуКраюВсеДействия.Пометка = Элементы.ВыровнятьПоНижнемуКраю.Пометка;
	
#КонецЕсли
	
КонецПроцедуры

&НаКлиенте
Функция ШагИзмененияРазмераШрифтаУвеличение(Размер)
	Если Размер = -1 Тогда
		Возврат 10;
	КонецЕсли;
	
	Если Размер < 10 Тогда
		Возврат 1;
	ИначеЕсли 10 <= Размер И  Размер < 20 Тогда
		Возврат 2;
	ИначеЕсли 20 <= Размер И  Размер < 48 Тогда
		Возврат 4;
	ИначеЕсли 48 <= Размер И  Размер < 72 Тогда
		Возврат 6;
	ИначеЕсли 72 <= Размер И  Размер < 96 Тогда
		Возврат 8;
	Иначе
		Возврат Окр(Размер / 10);
	КонецЕсли;
КонецФункции

&НаКлиенте
Функция ШагИзмененияРазмераШрифтаУменьшение(Размер)
	Если Размер = -1 Тогда
		Возврат -8;
	КонецЕсли;
	
	Если Размер <= 11 Тогда
		Возврат 1;
	ИначеЕсли 11 < Размер И Размер <= 23 Тогда
		Возврат 2;
	ИначеЕсли 23 < Размер И Размер <= 53 Тогда
		Возврат 4;
	ИначеЕсли 53 < Размер И Размер <= 79 Тогда
		Возврат 6;
	ИначеЕсли 79 < Размер И Размер <= 105 Тогда
		Возврат 8;
	Иначе
		Возврат Окр(Размер / 11);
	КонецЕсли;
КонецФункции

// Возвращаемое значение:
//   Массив из ОбластьЯчеекТабличногоДокумента
//
&НаКлиенте
Функция СписокОбластейДляИзмененияШрифта()
	
	Результат = Новый Массив;
	
	Для Каждого ОбрабатываемаяОбласть Из Элементы.ТабличныйДокумент.ПолучитьВыделенныеОбласти() Цикл
		Если ОбрабатываемаяОбласть.Шрифт <> Неопределено Тогда
			Результат.Добавить(ОбрабатываемаяОбласть);
			Продолжить;
		КонецЕсли;
		
		ОбрабатываемаяОбластьВерх = ОбрабатываемаяОбласть.Верх;
		ОбрабатываемаяОбластьНиз = ОбрабатываемаяОбласть.Низ;
		ОбрабатываемаяОбластьЛево = ОбрабатываемаяОбласть.Лево;
		ОбрабатываемаяОбластьПраво = ОбрабатываемаяОбласть.Право;
		
		Если ОбрабатываемаяОбластьВерх = 0 Тогда
			ОбрабатываемаяОбластьВерх = 1;
		КонецЕсли;
		
		Если ОбрабатываемаяОбластьНиз = 0 Тогда
			ОбрабатываемаяОбластьНиз = ТабличныйДокумент.ВысотаТаблицы;
		КонецЕсли;
		
		Если ОбрабатываемаяОбластьЛево = 0 Тогда
			ОбрабатываемаяОбластьЛево = 1;
		КонецЕсли;
		
		Если ОбрабатываемаяОбластьПраво = 0 Тогда
			ОбрабатываемаяОбластьПраво = ТабличныйДокумент.ШиринаТаблицы;
		КонецЕсли;
		
		Если ОбрабатываемаяОбласть.ТипОбласти = ТипОбластиЯчеекТабличногоДокумента.Колонки Тогда
			ОбрабатываемаяОбластьВерх = ОбрабатываемаяОбласть.Низ;
			ОбрабатываемаяОбластьНиз = ТабличныйДокумент.ВысотаТаблицы;
		КонецЕсли;
			
		Для НомерКолонки = ОбрабатываемаяОбластьЛево По ОбрабатываемаяОбластьПраво Цикл
			ШиринаКолонки = Неопределено;
			Для НомерСтроки = ОбрабатываемаяОбластьВерх По ОбрабатываемаяОбластьНиз Цикл
				Ячейка = ТабличныйДокумент.Область(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки);
				Если ОбрабатываемаяОбласть.ТипОбласти = ТипОбластиЯчеекТабличногоДокумента.Колонки Тогда
					Если ШиринаКолонки = Неопределено Тогда
						ШиринаКолонки = Ячейка.ШиринаКолонки;
					КонецЕсли;
					Если Ячейка.ШиринаКолонки <> ШиринаКолонки Тогда
						Продолжить;
					КонецЕсли;
				КонецЕсли;
				Если Ячейка.Шрифт <> Неопределено Тогда
					Результат.Добавить(Ячейка);
				КонецЕсли;
			КонецЦикла;
		КонецЦикла;
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

&НаКлиенте
Процедура ЗакрытьФормуПослеЗаписиТабличногоДокумента(Закрывать, ДополнительныеПараметры) Экспорт
	Если Закрывать Тогда
		Закрыть();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ЗаписатьТабличныйДокумент(ОбработчикЗавершения = Неопределено, ОсвободитьФайл = Ложь)

	ОчиститьПодсветку();
	
	ЕстьСсылка = ЗначениеЗаполнено(Параметры.Ссылка);
	Если ЭтоНовый() И Не ЭтоМакет И Не ЕстьСсылка Или РедактированиеЗапрещено Тогда
		НачатьДиалогСохраненияФайла(ОбработчикЗавершения, ОсвободитьФайл);
		Возврат;
	КонецЕсли;
		
	ЗаписатьТабличныйДокументИмяФайлаВыбрано(ОбработчикЗавершения, ОсвободитьФайл);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаписатьТабличныйДокументИмяФайлаВыбрано(Знач ОбработчикЗавершения, ОсвободитьФайл)
	
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("ОбработчикЗавершения", ОбработчикЗавершения);
	ДополнительныеПараметры.Вставить("ОсвободитьФайл", ОсвободитьФайл);
	
	Если ПустаяСтрока(Параметры.ПутьКФайлу) Тогда
		АдресМакетаВоВременномХранилище = "";
		ДополнительныеПараметры.Вставить("АдресМакетаВоВременномХранилище", АдресМакетаВоВременномХранилище);
		ОчиститьСообщения();
		
		Если ЗаписатьМакет(Истина, ДополнительныеПараметры.АдресМакетаВоВременномХранилище) Тогда
			ПослеЗаписиТабличногоДокумента(ДополнительныеПараметры.ОбработчикЗавершения, ОсвободитьФайл);
		Иначе
			ОписаниеОповещения = Новый ОписаниеОповещения("ПродолжитьЗаписьТабличногоДокумента", ЭтотОбъект, ДополнительныеПараметры);
			ПоказатьВопрос(ОписаниеОповещения, НСтр("ru = 'Макет содержит ошибки. Продолжить запись?'"), РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет);
		КонецЕсли;
	Иначе
		ТабличныйДокумент.НачатьЗапись(
			Новый ОписаниеОповещения("ОбработатьРезультатЗаписиТабличногоДокумента", ЭтотОбъект, ДополнительныеПараметры),
			Параметры.ПутьКФайлу);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПродолжитьЗаписьТабличногоДокумента(РезультатДиалога, ДополнительныеПараметры) Экспорт
	
	Если РезультатДиалога = КодВозвратаДиалога.Да Тогда
		ЗаписатьМакет(Ложь, ДополнительныеПараметры.АдресМакетаВоВременномХранилище);
		ПослеЗаписиТабличногоДокумента(ДополнительныеПараметры.ОбработчикЗавершения, ДополнительныеПараметры.ОсвободитьФайл);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьРезультатЗаписиТабличногоДокумента(Результат, ДополнительныеПараметры) Экспорт 
	Если Результат <> Истина Тогда 
		Возврат;
	КонецЕсли;
	
	РедактированиеЗапрещено = Ложь;
	ПослеЗаписиТабличногоДокумента(ДополнительныеПараметры.ОбработчикЗавершения, ДополнительныеПараметры.ОсвободитьФайл);
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗаписиТабличногоДокумента(ОбработчикЗавершения, ОсвободитьФайл)
	ЗаписьВыполнена = Истина;
	Модифицированность = Ложь;
	УстановитьЗаголовок();
	СохраненныеЯзыкиМакета.Добавить(ТекущийЯзык);
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда
		Если ЗначениеЗаполнено(Параметры.ПрисоединенныйФайл) Тогда
			МодульРаботаСФайламиСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСФайламиСлужебныйКлиент");
			Если ОсвободитьФайл Тогда
				ПараметрыОбновленияФайла = МодульРаботаСФайламиСлужебныйКлиент.ПараметрыОбновленияФайла(ОбработчикЗавершения, Параметры.ПрисоединенныйФайл, УникальныйИдентификатор);
				МодульРаботаСФайламиСлужебныйКлиент.ЗакончитьРедактированиеСОповещением(ПараметрыОбновленияФайла);
				Возврат;
			Иначе
				МодульРаботаСФайламиСлужебныйКлиент.СохранитьИзмененияФайлаСОповещением(ОбработчикЗавершения, Параметры.ПрисоединенныйФайл, УникальныйИдентификатор);
				Возврат;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	ВыполнитьОбработкуОповещения(ОбработчикЗавершения, Истина);
КонецПроцедуры

&НаКлиенте
Процедура НачатьДиалогСохраненияФайла(Знач ОбработчикЗавершения, ОсвободитьФайл)
	
	Перем ДиалогСохраненияФайла, ОписаниеОповещения;
	
	ДиалогСохраненияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	ДиалогСохраненияФайла.ПолноеИмяФайла = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ИмяДокумента);
	ДиалогСохраненияФайла.Фильтр = НСтр("ru = 'Табличный документ'") + " (*.mxl)|*.mxl";
	
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("ОбработчикЗавершения", ОбработчикЗавершения);
	ДополнительныеПараметры.Вставить("ОсвободитьФайл", ОсвободитьФайл);
		
	ОписаниеОповещения = Новый ОписаниеОповещения("ПриЗавершенииДиалогаВыбораФайла", ЭтотОбъект, ДополнительныеПараметры);
	ФайловаяСистемаКлиент.ПоказатьДиалогВыбора(ОписаниеОповещения, ДиалогСохраненияФайла);
	
КонецПроцедуры

&НаКлиенте
Процедура ПриЗавершенииДиалогаВыбораФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
	
	Если ВыбранныеФайлы = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ПолноеИмяФайла = ВыбранныеФайлы[0];
	
	Параметры.ПутьКФайлу = ПолноеИмяФайла;
	ИмяДокумента = Сред(ПолноеИмяФайла, СтрДлина(ОписаниеФайла(ПолноеИмяФайла).Путь) + 1);
	Если НРег(Прав(ИмяДокумента, 4)) = ".mxl" Тогда
		ИмяДокумента = Лев(ИмяДокумента, СтрДлина(ИмяДокумента) - 4);
	КонецЕсли;
	
	ЗаписатьТабличныйДокументИмяФайлаВыбрано(ДополнительныеПараметры.ОбработчикЗавершения, ДополнительныеПараметры.ОсвободитьФайл);
	
КонецПроцедуры

&НаКлиенте
Функция ОписаниеФайла(ПолноеИмя)
	
	ПозицияРазделителя = СтрНайти(ПолноеИмя, ПолучитьРазделительПути(), НаправлениеПоиска.СКонца);
	
	Имя = Сред(ПолноеИмя, ПозицияРазделителя + 1);
	Путь = Лев(ПолноеИмя, ПозицияРазделителя);
	
	ПозицияРасширения = СтрНайти(Имя, ".", НаправлениеПоиска.СКонца);
	
	ИмяБезРасширения = Лев(Имя, ПозицияРасширения - 1);
	Расширение = Сред(Имя, ПозицияРасширения + 1);
	
	Результат = Новый Структура;
	Результат.Вставить("ПолноеИмя", ПолноеИмя);
	Результат.Вставить("Имя", Имя);
	Результат.Вставить("Путь", Путь);
	Результат.Вставить("ИмяБезРасширения", ИмяБезРасширения);
	Результат.Вставить("Расширение", Расширение);
	
	Возврат Результат;
	
КонецФункции
	
&НаКлиенте
Функция ИмяНовогоДокумента()
	Возврат НСтр("ru = 'Новый'");
КонецФункции

&НаКлиенте
Процедура УстановитьЗаголовок()
	
	Заголовок = ИмяДокумента;
	Если ЗначениеЗаполнено(ТекущийЯзык) Тогда
		ТекущийЯзыкПредставление = Элементы["Язык_"+ТекущийЯзык].Заголовок; 
		Заголовок = Заголовок + " ("+ТекущийЯзыкПредставление+")";
	КонецЕсли;
	
	Если ЭтоНовый() Тогда
		Заголовок = Заголовок + " (" + НСтр("ru = 'создание'") + ")";
	ИначеЕсли РедактированиеЗапрещено Тогда
		Заголовок = Заголовок + " (" + НСтр("ru = 'только просмотр'") + ")";
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура НастроитьПредставлениеКоманд()
	
	ДокументРедактируется = Элементы.ТабличныйДокумент.Редактирование;
	Элементы.Редактирование.Пометка = ДокументРедактируется;
	Элементы.КомандыРедактирования.Доступность = ДокументРедактируется;
	Элементы.ЗаписатьИЗакрыть.Доступность = ДокументРедактируется Или Модифицированность;
	Элементы.Записать.Доступность = ДокументРедактируется Или Модифицированность;

	Если ДокументРедактируется И ЭтоМакет И Не ЭтоПечатнаяФорма Тогда
		Элементы.Предупреждение.Видимость = Истина;
	КонецЕсли;
	
	Элементы.Редактирование.Доступность = ДокументРедактируется Или Не ЭтоМакет;
	Элементы.ЗагрузитьИзФайла.Доступность = ДокументРедактируется Или Не ЭтоМакет;
	Элементы.ЗачеркиваниеВсеДействия.Доступность = ДокументРедактируется Или Не ЭтоМакет;
	Элементы.ТекущееЗначение.Доступность = ДокументРедактируется;
	Элементы.ПоказыватьКолонтитулы.Доступность = ДокументРедактируется;
	Элементы.Перевести.Доступность = ДокументРедактируется;
	УстановитьДоступностьРекурсивно(Элементы.КомандыРедактирования);
	УстановитьДоступностьРекурсивно(Элементы.ДобавляемыеЯзыки, ДокументРедактируется);
	
КонецПроцедуры

&НаКлиенте
Функция ЭтоНовый()
	Возврат Не ЗначениеЗаполнено(Параметры.Ссылка) И ПустаяСтрока(ИдентификаторМакета) И ПустаяСтрока(Параметры.ПутьКФайлу);
КонецФункции

&НаКлиенте
Процедура РедактироватьВоВнешнейПрограммеЗавершение(ЗагруженныйТабличныйДокумент, ДополнительныеПараметры) Экспорт
	Если ЗагруженныйТабличныйДокумент = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Модифицированность = Истина;
	ОбновитьТабличныйДокумент(ЗагруженныйТабличныйДокумент);
КонецПроцедуры

&НаСервере
Процедура ОбновитьТабличныйДокумент(ЗагруженныйТабличныйДокумент)
	ЗаполнитьТабличныйДокумент(ТабличныйДокумент, ЗагруженныйТабличныйДокумент);
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ЗаполнитьТабличныйДокумент(ТабличныйДокумент, Знач ЗагруженныйТабличныйДокумент)
	Для НомерСтроки = 1 По ЗагруженныйТабличныйДокумент.ВысотаТаблицы Цикл
		Для НомерКолонки = 1 По ЗагруженныйТабличныйДокумент.ШиринаТаблицы Цикл
			ИсходнаяЯчейка = ЗагруженныйТабличныйДокумент.Область(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки);
			Если ИсходнаяЯчейка.Заполнение <> ТипЗаполненияОбластиТабличногоДокумента.Текст Тогда
				ТабличныйДокумент = ЗагруженныйТабличныйДокумент;
				Возврат;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
	ТабличныйДокумент.Очистить();
	ТабличныйДокумент.Вывести(ЗагруженныйТабличныйДокумент);
	
	
	ТабличныйДокумент.ВерхнийКолонтитул.ТекстСлева = ЗагруженныйТабличныйДокумент.ВерхнийКолонтитул.ТекстСлева;
	ТабличныйДокумент.ВерхнийКолонтитул.ТекстВЦентре = ЗагруженныйТабличныйДокумент.ВерхнийКолонтитул.ТекстВЦентре;
	ТабличныйДокумент.ВерхнийКолонтитул.ТекстСправа = ЗагруженныйТабличныйДокумент.ВерхнийКолонтитул.ТекстСправа;
	ТабличныйДокумент.НижнийКолонтитул.ТекстСлева = ЗагруженныйТабличныйДокумент.НижнийКолонтитул.ТекстСлева;
	ТабличныйДокумент.НижнийКолонтитул.ТекстВЦентре = ЗагруженныйТабличныйДокумент.НижнийКолонтитул.ТекстВЦентре;
	ТабличныйДокумент.НижнийКолонтитул.ТекстСправа = ЗагруженныйТабличныйДокумент.НижнийКолонтитул.ТекстСправа;
	
	Для Каждого Область Из ТабличныйДокумент.Области Цикл
		Если ТипЗнч(Область) = Тип("ОбластьЯчеекТабличногоДокумента")
			И Область.ТипОбласти = ТипОбластиЯчеекТабличногоДокумента.Строки
			Или ТипЗнч(Область) = Тип("РисунокТабличногоДокумента") Тогда
				КопируемаяОбласть = ЗагруженныйТабличныйДокумент.Области.Найти(Область.Имя);
				Если КопируемаяОбласть = Неопределено Тогда
					Продолжить;
				КонецЕсли;
				Область.ПараметрРасшифровки = КопируемаяОбласть.ПараметрРасшифровки;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьНачальныеНастройкиФормы()
	
	Если Не ПустаяСтрока(Параметры.ПутьКФайлу) И Не РедактированиеЗапрещено Тогда
		Элементы.ТабличныйДокумент.Редактирование = Истина;
	КонецЕсли;
	
	УстановитьИмяДокумента();
	УстановитьЗаголовок();
	НастроитьПредставлениеКоманд();
	НастроитьОтображениеТабличногоДокумента();

КонецПроцедуры

&НаКлиенте
Процедура УстановитьИмяДокумента()

	Если ПустаяСтрока(ИмяДокумента) Тогда
		ИспользованныеИмена = Новый Массив;
		Оповестить("ЗапросИменРедактируемыхТабличныхДокументов", ИспользованныеИмена, ЭтотОбъект);
		
		Индекс = 1;
		Пока ИспользованныеИмена.Найти(ИмяНовогоДокумента() + Индекс) <> Неопределено Цикл
			Индекс = Индекс + 1;
		КонецЦикла;
		
		ИмяДокумента = ИмяНовогоДокумента() + Индекс;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПриЗавершенииПолученияТолькоЧтения(ТолькоЧтение, ДополнительныеПараметры) Экспорт
	
	РедактированиеЗапрещено = ТолькоЧтение;
	УстановитьНачальныеНастройкиФормы();
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПереключитьЯзык(Команда)
	
	Если ЭтоНовый() Тогда
		Возврат;
	КонецЕсли;
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		МодульУправлениеПечатьюКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеПечатьюКлиент");
		МодульУправлениеПечатьюКлиент.ПереключитьЯзык(ЭтотОбъект, Команда);
		
		Элементы.УдалитьЯзыкМакета.Видимость = Не ЗначениеЗаполнено(Параметры.Ссылка) 
			Или ТекущийЯзык <> ОбщегоНазначенияКлиент.КодОсновногоЯзыка();
			
		Элементы.КнопкаПоказатьСкрытьОригинал.Доступность = ПоставляемыйМакет.ВысотаТаблицы > 0;
		Если ЭтоПечатнаяФорма Тогда
			ЗаполнитьТабличныйДокумент(ТабличныйДокумент, ПрочитатьМакет());
		КонецЕсли;
		
		Если ТекущийЯзык = ОбщегоНазначенияКлиент.КодОсновногоЯзыка() Тогда
			Элементы.УдалитьЯзыкМакета.Заголовок = НСтр("ru = 'Удалить все изменения макета'");
		Иначе
			Элементы.УдалитьЯзыкМакета.Заголовок = НСтр("ru = 'Удалить макет на текущем языке'");
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура УдалитьЯзыкМакета(Команда)
	
	УдалитьМакетНаТекущемЯзыке();

	ЗаписьВыполнена = Истина;
	ОповеститьОЗаписиТабличногоДокумента();

	Элементы.УдалитьЯзыкМакета.Видимость = Не ЗначениеЗаполнено(Параметры.Ссылка)
		Или ТекущийЯзык <> ОбщегоНазначенияКлиент.КодОсновногоЯзыка();
	
	УстановитьЗаголовок();
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПриПереключенииЯзыка(КодЯзыка, ДополнительныеПараметры) Экспорт
	
	УстановитьЗаголовок();
	ЗагрузитьТабличныйДокументИзМетаданных(КодЯзыка);
	Если ТребуетсяПеревод И ДоступенАвтоматическийПеревод Тогда
		ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Макет еще не переведен на %1 язык.
			|Выполнить автоматический перевод?'"), Элементы.Язык.Заголовок);
		Кнопки = Новый СписокЗначений;
		Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Выполнить перевод'"));
		Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Не выполнять'"));
		
		ОписаниеОповещения = Новый ОписаниеОповещения("ПриОтветеНаВопросОПереводеМакета", ЭтотОбъект);
		ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, Кнопки);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОтветеНаВопросОПереводеМакета(Ответ, ДополнительныеПараметры) Экспорт
	
	Если Ответ <> КодВозвратаДиалога.Да Тогда
		Возврат;
	КонецЕсли;
	
	ПеревестиТекстыМакета();
	
КонецПроцедуры

&НаСервере
Процедура ПеревестиТекстыМакета()
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.ПереводТекста") Тогда
		МодульПереводТекстаНаДругиеЯзыки = ОбщегоНазначения.ОбщийМодуль("ПереводТекстаНаДругиеЯзыки");
		МодульПереводТекстаНаДругиеЯзыки.ПеревестиТекстыТабличногоДокумента(ТабличныйДокумент, ТекущийЯзык, ОбщегоНазначения.КодОсновногоЯзыка());
	КонецЕсли;
	
	Модифицированность = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура ПоказатьСкрытьОригинал(Команда)
	
	Элементы.КнопкаПоказатьСкрытьОригинал.Пометка = Не Элементы.КнопкаПоказатьСкрытьОригинал.Пометка;
	Элементы.ПоставляемыйМакет.Видимость = Элементы.КнопкаПоказатьСкрытьОригинал.Пометка;
	Если Элементы.КнопкаПоказатьСкрытьОригинал.Пометка Тогда
		Элементы.ТабличныйДокумент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Авто;
	Иначе
		Элементы.ТабличныйДокумент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СинхронизироватьОбластьПросмотраМакетов()
	
	Если Не Элементы.ПоставляемыйМакет.Видимость Тогда
		Возврат;
	КонецЕсли;
	
	УправляемыйЭлемент = Элементы.ПоставляемыйМакет;
	Если ТекущийЭлемент <> Элементы.ТабличныйДокумент Тогда
		УправляемыйЭлемент = Элементы.ТабличныйДокумент;
		ТекущийЭлемент = Элементы.ПоставляемыйМакет;
	КонецЕсли;
	
	Область = ТекущийЭлемент.ТекущаяОбласть;
	Если Область = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ТипЗнч(Область) = Тип("ОбластьЯчеекТабличногоДокумента") Тогда
		УправляемыйЭлемент.ТекущаяОбласть = ЭтотОбъект[ТекущийЭлемент.Имя].Область(
			Область.Верх, Область.Лево, Область.Низ, Область.Право);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОповеститьОЗаписиТабличногоДокумента()
	
	ПараметрыОповещения = Новый Структура;
	ПараметрыОповещения.Вставить("ПутьКФайлу", Параметры.ПутьКФайлу);
	ПараметрыОповещения.Вставить("ИмяОбъектаМетаданныхМакета", ИдентификаторМакета);
	ПараметрыОповещения.Вставить("КодЯзыка", ТекущийЯзык);
	ПараметрыОповещения.Вставить("Представление", ИмяДокумента);
	ПараметрыОповещения.Вставить("ИсточникиДанных", ИсточникиДанных.ВыгрузитьЗначения());
	
	Если ЗаписьВыполнена Тогда
		ИмяСобытия = "Запись_ТабличныйДокумент";
	Иначе
		ИмяСобытия = "ОтменаРедактированияТабличногоДокумента";
	КонецЕсли;
	Оповестить(ИмяСобытия, ПараметрыОповещения, ЭтотОбъект);
	
	ЗаписьВыполнена = Ложь;
	
КонецПроцедуры

&НаСервере
Процедура РазблокироватьНаСервере() 
	РазблокироватьДанныеДляРедактирования(КлючОбъектаРедактирования, УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьШрифтПродолжение(Результат, Параметры) Экспорт 
	
	ТекущаяОбласть = Элементы.ТабличныйДокумент.ТекущаяОбласть;
	
	Если Результат = Неопределено Тогда 
		Возврат;
	ИначеЕсли Результат = -1 Тогда 
		ДиалогВыбораШрифта = Новый ДиалогВыбораШрифта;
		ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеИзменитьШрифт", ЭтотОбъект);
		ДиалогВыбораШрифта.Шрифт = ТекущаяОбласть.Шрифт;
		ДиалогВыбораШрифта.Показать(ОписаниеОповещения);
	Иначе 
		ТекущаяОбласть.Шрифт = Новый Шрифт(ТекущаяОбласть.Шрифт, Результат);
		Модифицированность = Истина;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗавершениеИзменитьШрифт(Шрифт, Параметры) Экспорт

	Если Шрифт = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ТекущаяОбласть = Элементы.ТабличныйДокумент.ТекущаяОбласть;
	ТекущаяОбласть.Шрифт = Шрифт;
	Модифицированность = Истина;
		
КонецПроцедуры

&НаКлиенте
Процедура ЗавершениеИзменитьЦветГраницы(Цвет, Параметры) Экспорт
	
	УстановитьЦвет("ЦветРамки", Цвет);
	
КонецПроцедуры


&НаКлиенте
Процедура ЗавершениеИзменитьЦветТекста(Цвет, Параметры) Экспорт
	
	УстановитьЦвет("ЦветТекста", Цвет);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗавершениеИзменитьЦветФона(Цвет, Параметры) Экспорт
	
	УстановитьЦвет("ЦветФона", Цвет);
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьЦвет(ИмяПоля, Цвет)
	ТекущаяОбласть = Элементы.ТабличныйДокумент.ТекущаяОбласть;
	Если ТипЗнч(Цвет) = Тип("Цвет")Тогда
		ТекущаяОбласть[ИмяПоля] = Цвет;
		Модифицированность = Истина;
	ИначеЕсли Цвет = "ДругиеЦвета" Тогда
		ДиалогВыбораЦвета = Новый ДиалогВыбораЦвета();
		ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВыбораЦвета", ЭтотОбъект, ИмяПоля);
		ДиалогВыбораЦвета.Показать(ОписаниеОповещения);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораЦвета(Цвет, ИмяПоля) Экспорт
	УстановитьЦвет(ИмяПоля, Цвет);
КонецПроцедуры

#Область КонструкторПечатныхФорм

&НаСервере
Функция ВладелецМакета()
	
	Если ЗначениеЗаполнено(ВладелецМакета) Тогда
		Возврат ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(ВладелецМакета);
	КонецЕсли;
	
	ПутьКМакету = ИдентификаторМакета;
	
	ЧастиПути = СтрРазделить(ПутьКМакету, ".", Истина);
	Если ЧастиПути.Количество() <> 2 И ЧастиПути.Количество() <> 3 Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Если ЧастиПути.Количество() <> 3 Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	ЧастиПути.Удалить(ЧастиПути.ВГраница());
	ИмяОбъекта = СтрСоединить(ЧастиПути, ".");
	
	Если ПустаяСтрока(ИмяОбъекта) Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Возврат ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъекта);
	
КонецФункции

&НаКлиенте
Процедура ТабличныйДокументПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Область)

	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда
		МодульКонструкторФормулКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("КонструкторФормулКлиент");
	
		Если ТипЗнч(ПараметрыПеретаскивания.Значение) <> Тип("Строка") Тогда 
			Возврат;
		КонецЕсли;
		
		ВыбранноеПоле = МодульКонструкторФормулКлиент.ВыбранноеПолеВСпискеПолей(ЭтотОбъект, ИмяСпискаПолей());
		Если ВыбранноеПоле = Неопределено Тогда
			Возврат;
		КонецЕсли;
		
		РазместитьРисунокВТабличномДокументе(ВыбранноеПоле, СтандартнаяОбработка, Область.Лево, Область.Верх);
		
		Если СтандартнаяОбработка Тогда
			СтандартнаяОбработка = Ложь;
			Область = ТабличныйДокумент.Область(Область.Верх, Область.Лево); // Получение области объединенных ячеек.
			Область.Текст = ?(ЗначениеЗаполнено(Область.Текст), СокрП(Область.Текст) + " ", "") + ПараметрыПеретаскивания.Значение;
		КонецЕсли;
	КонецЕсли;
	ПолучательПеретаскиваемогоЗначения = Элемент;

КонецПроцедуры

&НаСервере
Процедура РазместитьРисунокВТабличномДокументе(ВыбранноеПоле, СтандартнаяОбработка, Лево, Верх)
	
	Область = ТабличныйДокумент.Область(Верх, Лево, Верх, Лево);
	
	Если СтрНачинаетсяС(ВыбранноеПоле.Имя, "Печать") Тогда
		СтандартнаяОбработка = Ложь;
		
		Рисунок = ТабличныйДокумент.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
		Рисунок.Имя = ПодобратьИмяОбласти(ВыбранноеПоле.Имя);
		Рисунок.ПараметрРасшифровки = "[" + ВыбранноеПоле.ПутьКДанным + "]";
		Рисунок.Картинка = БиблиотекаКартинок["ПечатьОрганизации"];
		Рисунок.Расположить(Область);
		Рисунок.Высота = 40;
		Рисунок.Ширина = 40;
		Рисунок.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии);
		Рисунок.ЦветФона = ЦветПоУмолчанию();
		Рисунок.РазмерКартинки = РазмерКартинки.Пропорционально;
		
		Элементы.ТабличныйДокумент.ТекущаяОбласть = Область;
		Возврат;
	КонецЕсли;

	Если СтрНачинаетсяС(ВыбранноеПоле.Имя, "Подпись") Тогда
		СтандартнаяОбработка = Ложь;
		Рисунок = ТабличныйДокумент.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
		Рисунок.Имя = ПодобратьИмяОбласти(ВыбранноеПоле.Имя);
		Рисунок.ПараметрРасшифровки = "[" + ВыбранноеПоле.ПутьКДанным + "]";
		Рисунок.Картинка = БиблиотекаКартинок["Подпись"];
		Рисунок.Расположить(Область);
		Рисунок.Высота = 10;
		Рисунок.Ширина = 30;
		Рисунок.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии);
		Рисунок.ЦветФона = ЦветПоУмолчанию();
		Рисунок.РазмерКартинки = РазмерКартинки.Пропорционально;
		
		Элементы.ТабличныйДокумент.ТекущаяОбласть = Область;
		Возврат;
	КонецЕсли;
	
	Если ВыбранноеПоле.Имя = "ШтампЭП" Тогда
		СтандартнаяОбработка = Ложь;

		ОбластьСтрок = ТабличныйДокумент.Область(Область.Верх, , Область.Верх + 6);
		ОбластьСтрок.СоздатьФорматСтрок();
		
		ОбластьШтампа = ТабличныйДокумент.Область(Область.Верх, Область.Лево, Область.Верх + 6, Область.Лево + 1);
		ОбластьШтампа.Имя = ПодобратьИмяОбласти("ШтампЭП");
		
		ОбластьШтампа = ТабличныйДокумент.Область(Область.Верх, Область.Лево, Область.Верх + 6, Область.Лево);
		ОбластьШтампа.ШиринаКолонки = 10;
		ОбластьШтампа = ТабличныйДокумент.Область(Область.Верх, Область.Лево + 1, Область.Верх + 6, Область.Лево + 1);
		ОбластьШтампа.ШиринаКолонки = 30;
		
		Элементы.ТабличныйДокумент.ТекущаяОбласть = Область;
		Возврат;
	КонецЕсли;
	
	Если ВыбранноеПоле.Имя = "QRКод" Тогда
		СтандартнаяОбработка = Ложь;
		
		Рисунок = ТабличныйДокумент.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
		Рисунок.Имя = ПодобратьИмяОбласти(ВыбранноеПоле.Имя);
		Рисунок.ПараметрРасшифровки = "[" + ВыбранноеПоле.ПутьКДанным + "]";
		Рисунок.Расположить(Область);
		Рисунок.Высота = 40;
		Рисунок.Ширина = 40;
		Рисунок.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии);
		Рисунок.ЦветФона = ЦветПоУмолчанию();
		Рисунок.РазмерКартинки = РазмерКартинки.Пропорционально;
		Рисунок.Картинка = БиблиотекаКартинок["МестоДляQRКода"];
		
		Элементы.ТабличныйДокумент.ТекущаяОбласть = Область;
		Возврат;
	КонецЕсли;
	
	Если ВыбранноеПоле.Имя = "КартинкаШтрихкода" Тогда
		СтандартнаяОбработка = Ложь;
		
		Рисунок = ТабличныйДокумент.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
		Рисунок.Имя = ПодобратьИмяОбласти(ВыбранноеПоле.Имя);
		Рисунок.ПараметрРасшифровки = "[" + ВыбранноеПоле.ПутьКДанным + "]";
		Рисунок.Расположить(Область);
		Рисунок.Высота = 25.93;
		Рисунок.Ширина = 37.29;
		Рисунок.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии);
		Рисунок.ЦветФона = ЦветПоУмолчанию();
		Рисунок.РазмерКартинки = РазмерКартинки.Пропорционально;
		Рисунок.Картинка = БиблиотекаКартинок["МестоДляШтрихкода"];
		
		Элементы.ТабличныйДокумент.ТекущаяОбласть = Область;
		Возврат;
	КонецЕсли;
	
	ЭтоПрисоединенныйФайл = ВыбранноеПоле.Тип.Типы().Количество() = 1
		И ТипыПрисоединенныхФайлов.СодержитТип(ВыбранноеПоле.Тип.Типы()[0]);
		
	Если ЭтоПрисоединенныйФайл Тогда
		СтандартнаяОбработка = Ложь;
		
		Рисунок = ТабличныйДокумент.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
		Рисунок.Имя = ПодобратьИмяОбласти("Рисунок");
		Рисунок.ПараметрРасшифровки = "[" + ВыбранноеПоле.ПутьКДанным + "]";
		Рисунок.Картинка = БиблиотекаКартинок["МестоДляКартинки"];
		Рисунок.Расположить(Область);
		Рисунок.Высота = 20;
		Рисунок.Ширина = 20;
		Рисунок.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии);
		Рисунок.ЦветФона = ЦветПоУмолчанию();
		Рисунок.РазмерКартинки = РазмерКартинки.Пропорционально;
		
		Элементы.ТабличныйДокумент.ТекущаяОбласть = Область;
		Возврат;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ТабличныйДокументПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Область)

	Если ТипЗнч(ПараметрыПеретаскивания.Значение) <> Тип("Массив")
		Или ПараметрыПеретаскивания.Значение.Количество() <> 1 
		Или Не ПараметрыПеретаскивания.Значение[0].Таблица Тогда
		Возврат;
	КонецЕсли;
	
	КоличествоКолонок = ПараметрыПеретаскивания.Значение[0].Элементы.Количество();
	Если КоличествоКолонок = 0 Тогда
		ШиринаОбласти = ?(Область.Лево > 1, 2, 1);
		Область = ТабличныйДокумент.Область(Область.Верх, Область.Лево, Область.Верх, Область.Лево + ШиринаОбласти - 1);
		Элемент.ТекущаяОбласть = Область;
		Возврат;
	КонецЕсли;
	
	СтандартнаяОбработка = Ложь;
	Область = ТабличныйДокумент.Область(Область.Верх, Область.Лево, Область.Верх + 1, Область.Лево + КоличествоКолонок - 1);
	Элемент.ТекущаяОбласть = Область;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьПолеВводаЗначенияТекущейЯчейки()
	
	ТекущаяОбласть = ТабличныйДокумент.ТекущаяОбласть;
	ДоступноРедактирование = Элементы.ТабличныйДокумент.Редактирование И ТекущаяОбласть <> Неопределено И ТипЗнч(ТекущаяОбласть) = Тип("ОбластьЯчеекТабличногоДокумента");
	Элементы.ТекущееЗначение.Доступность = ДоступноРедактирование;
	Если ДоступноРедактирование Тогда
		ТекущееЗначение = ТекущаяОбласть.Текст;
	Иначе
		ТекущееЗначение = "";
	КонецЕсли;
	
	Элементы.ПовторятьВНачалеСтраницы.Доступность = Ложь;
	Элементы.ПовторятьВКонцеСтраницы.Доступность = Ложь;
	
	ПредставлениеОбласти = НСтр("ru = 'Текст выбранной ячейки'");
	Если ТипЗнч(ТекущаяОбласть) = Тип("ОбластьЯчеекТабличногоДокумента") Тогда
		Если ТекущаяОбласть.ТипОбласти = ТипОбластиЯчеекТабличногоДокумента.Строки
			И ЗначениеЗаполнено(ТекущаяОбласть.Верх) Тогда
			Диапазон = ТекущаяОбласть.Верх;
			Если ТекущаяОбласть.Верх <> ТекущаяОбласть.Низ Тогда
				Диапазон = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = '%1-%2'"), ТекущаяОбласть.Верх, ТекущаяОбласть.Низ);
				ПредставлениеОбласти = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Условия вывода строк %1'"), Диапазон);
			Иначе
				ПредставлениеОбласти = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Условия вывода строки %1'"), Диапазон);
			КонецЕсли;
			Элементы.ПовторятьВНачалеСтраницы.Доступность = Истина;
			Элементы.ПовторятьВКонцеСтраницы.Доступность = Истина;
			
			Если ЗначениеЗаполнено(ТекущаяОбласть.Имя) Тогда
				ТекущееЗначение = ТекущаяОбласть.ПараметрРасшифровки;
			КонецЕсли;
		КонецЕсли;
		Если ЗначениеЗаполнено(ТекущаяОбласть.Лево) И Не ЗначениеЗаполнено(ТекущаяОбласть.Верх) Тогда
			Диапазон = ТекущаяОбласть.Лево;
			Если ТекущаяОбласть.Лево <> ТекущаяОбласть.Право Тогда
				Диапазон = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = '%1-%2'"), ТекущаяОбласть.Лево, ТекущаяОбласть.Право);
				ПредставлениеОбласти = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Условия вывода колонок %1'"), Диапазон);
			Иначе
				ПредставлениеОбласти = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Условия вывода колонки %1'"), Диапазон);
			КонецЕсли;
		КонецЕсли;
		Если ЗначениеЗаполнено(ТекущаяОбласть.Лево) И ЗначениеЗаполнено(ТекущаяОбласть.Верх) Тогда
			Если ТекущаяОбласть.Лево <> ТекущаяОбласть.Право Или ТекущаяОбласть.Верх <> ТекущаяОбласть.Низ Тогда
				ПредставлениеОбласти = НСтр("ru = 'Текст в выбранной области'");
			Иначе
				ПредставлениеОбласти = НСтр("ru = 'Текст выбранной ячейки'");
			КонецЕсли;
		КонецЕсли;
		ИмяОбласти = ПредставлениеОбласти;
	КонецЕсли;
	
	Элементы.УдалитьШтампЭП.Доступность = ТипЗнч(ТекущаяОбласть) = Тип("ОбластьЯчеекТабличногоДокумента")
		И СтрНачинаетсяС(ТекущаяОбласть.Имя, "ШтампЭП");
	
	Если ТипЗнч(ТекущаяОбласть) = Тип("ОбластьЯчеекТабличногоДокумента")
		И ТекущаяОбласть.ТипОбласти = ТипОбластиЯчеекТабличногоДокумента.Строки Тогда
			Элементы.ПовторятьВНачалеСтраницы.Пометка = ТекущаяОбласть.НачалоСтраницы;
			Элементы.ПовторятьВКонцеСтраницы.Пометка = ТекущаяОбласть.КонецСтраницы;
	Иначе
		Элементы.ПовторятьВНачалеСтраницы.Пометка = Ложь;
		Элементы.ПовторятьВКонцеСтраницы.Пометка = Ложь;
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ПодобратьОбразец(ОбъектМетаданных)
	
	ТекстЗапроса =
	"ВЫБРАТЬ ПЕРВЫЕ 1 РАЗРЕШЕННЫЕ
	|	ПсевдонимЗаданнойТаблицы.Ссылка КАК Ссылка
	|ИЗ
	|	&Таблица КАК ПсевдонимЗаданнойТаблицы
	|
	|УПОРЯДОЧИТЬ ПО
	|	Ссылка УБЫВ";
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Таблица", ОбъектМетаданных.ПолноеИмя());
	Запрос = Новый Запрос(ТекстЗапроса);
	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		Образец = Выборка.Ссылка;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура НастроитьКолонтитулы(Команда)
	
	Элементы.ПоказыватьКолонтитулы.Пометка = Не Элементы.ПоказыватьКолонтитулы.Пометка;
	Элементы.ВерхнийКолонтитул.Видимость = Элементы.ПоказыватьКолонтитулы.Пометка;
	Элементы.НижнийКолонтитул.Видимость = Элементы.ПоказыватьКолонтитулы.Пометка;
	Элементы.КомандыРедактирования.Видимость = Не Элементы.КомандыРедактирования.Видимость;
	Элементы.КоманднаяПанельКолонтитулов.Видимость = Не Элементы.КомандыРедактирования.Видимость;
	Элементы.ТекущееЗначение.Видимость = Не Элементы.ПоказыватьКолонтитулы.Пометка;
	Элементы.НастройкиТекущейОбласти.Видимость = Не Элементы.ПоказыватьКолонтитулы.Пометка;
	Элементы.ТабличныйДокумент.ТолькоПросмотр = Элементы.ПоказыватьКолонтитулы.Пометка;
		
	ТекстСостояния = ?(Элементы.ПоказыватьКолонтитулы.Пометка, НСтр("ru = 'Редактирование колонтитулов'"), "");
	ОтобразитьСостояниеТекущейПечатнойФормы(ТекстСостояния);
	
	Если Элементы.ПоказыватьКолонтитулы.Пометка Тогда
		ПереключитьВидимостьКомандКолонтитулов();
	Иначе
		ОтключитьОбработчикОжидания("ПереключитьВидимостьКомандКолонтитулов");
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьФормат(Команда)
	ТекущаяОбласть = Элементы.ТабличныйДокумент.ТекущаяОбласть;
	ТекущаяОбласть.Шрифт 		= Неопределено;
	ТекущаяОбласть.ЦветРамки 	= ЦветПоУмолчанию();
	ТекущаяОбласть.ЦветТекста 	= ЦветПоУмолчанию();
	ТекущаяОбласть.ЦветУзора 	= ЦветПоУмолчанию();
	ТекущаяОбласть.ЦветФона 	= ЦветПоУмолчанию();
	ТекущаяОбласть.ВертикальноеПоложение 			= Неопределено;
	ТекущаяОбласть.ВертикальноеПоложениеКартинки 	= Неопределено;
	ТекущаяОбласть.ГоризонтальноеПоложение			= Неопределено;
	ТекущаяОбласть.ГоризонтальноеПоложениеКартинки	= Неопределено;
	Модифицированность = Истина;
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ЦветПоУмолчанию()
	Возврат Новый Цвет;
КонецФункции

&НаСервере
Процедура УстановитьПримерыЗначений(КоллекцияПолей = Неопределено, ДанныеПечати = Неопределено)

	Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		Возврат;
	КонецЕсли;
	
	МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");

	Если КоллекцияПолей = Неопределено Тогда
		КоллекцияПолей = ЭтотОбъект[ИмяСпискаПолей()];
	КонецЕсли;
	
	Если ДанныеПечати = Неопределено Тогда
		Если Не ЗначениеЗаполнено(Образец) Тогда
			Возврат;
		КонецЕсли;
		Объекты = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Образец);
		ОтображаемыеПоля = ЗаполнитьСписокОтображаемыхПолей(КоллекцияПолей);
		Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
			Попытка
				ДанныеПечати = МодульУправлениеПечатью.ДанныеПечати(Объекты, ОтображаемыеПоля, ТекущийЯзык);
			Исключение
				РазблокироватьДанныеДляРедактирования(КлючОбъектаРедактирования, УникальныйИдентификатор);
				ВызватьИсключение ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
			КонецПопытки;
			ПолучитьСообщенияПользователю(Истина);
		Иначе
			Возврат;
		КонецЕсли;
	КонецЕсли;
	
	МодульУправлениеПечатью.УстановитьПримерыЗначений(КоллекцияПолей, ДанныеПечати, Образец);
	
КонецПроцедуры

&НаСервере
Процедура УстановитьФорматЗначенийПоУмолчанию(КоллекцияПолей = Неопределено)
	
	Если КоллекцияПолей = Неопределено Тогда
		КоллекцияПолей = ЭтотОбъект[ИмяСпискаПолей()];
	КонецЕсли;
	
	Для Каждого Элемент Из КоллекцияПолей.ПолучитьЭлементы() Цикл
		Если Не ЗначениеЗаполнено(Элемент.ПутьКДанным) Тогда
			Продолжить;
		КонецЕсли;
		
		Если Не ЗначениеЗаполнено(Элемент.ФорматПоУмолчанию) Тогда
			Элемент.ФорматПоУмолчанию = ФорматПоУмолчанию(Элемент.Тип);
		КонецЕсли;
		
		Элемент.Формат = Элемент.ФорматПоУмолчанию;
		
		Если ЗначениеЗаполнено(Элемент.Формат) Тогда
			Элемент.Образец = Формат(Элемент.Образец, Элемент.Формат);
		Иначе
			Элемент.КнопкаНастройкиФормата = -1;
		КонецЕсли;
			
		УстановитьФорматЗначенийПоУмолчанию(Элемент);
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Функция ФорматПоУмолчанию(ОписаниеТипов)
	
	Формат = "";
	Если ОписаниеТипов.Типы().Количество() <> 1 Тогда
		Возврат Формат;
	КонецЕсли;
	
	Тип = ОписаниеТипов.Типы()[0];
	
	Если Тип = Тип("Число") Тогда
		Формат = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'ЧЦ=%1; ЧДЦ=%2'"),
			ОписаниеТипов.КвалификаторыЧисла.Разрядность,
			ОписаниеТипов.КвалификаторыЧисла.РазрядностьДробнойЧасти);
	ИначеЕсли Тип = Тип("Дата") Тогда
		Если ОписаниеТипов.КвалификаторыДаты.ЧастиДаты = ЧастиДаты.Дата Тогда
			Формат = НСтр("ru = 'ДЛФ=D'");
		Иначе
			Формат = НСтр("ru = 'ДЛФ=DT'");
		КонецЕсли;
	ИначеЕсли Тип = Тип("Булево") Тогда
		Формат = НСтр("ru = 'БЛ=Нет; БИ=Да'");
	КонецЕсли;
	
	Возврат Формат;
	
КонецФункции

&НаКлиенте
Процедура ПодсветитьЯчейкиСВыбраннымПолем()
	
	ТекущиеДанные = Элементы[ИмяСпискаПолей()].ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Или Не ЗначениеЗаполнено(ТекущиеДанные.ПредставлениеПутиКДанным) Тогда
		Возврат;
	КонецЕсли;
	
	ОчиститьПодсветку();
	ОбработанныеОбласти = Новый Соответствие();
	
	МодульУправлениеПечатьюКлиент = Неопределено;
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		МодульУправлениеПечатьюКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеПечатьюКлиент");
	Иначе
		Возврат;
	КонецЕсли;
	
	Для НомерСтроки = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл
		Для НомерКолонки = 1 По ТабличныйДокумент.ШиринаТаблицы Цикл
			Область = ТабличныйДокумент.Область(НомерСтроки, НомерКолонки);

			ИдентификаторОбласти = МодульУправлениеПечатьюКлиент.ИдентификаторОбласти(Область);
			Если ОбработанныеОбласти[ИдентификаторОбласти] <> Неопределено Тогда
				Продолжить;
			КонецЕсли;
			ОбработанныеОбласти[ИдентификаторОбласти] = Истина;
			
			Если ТекущиеДанные.Таблица
				И СтрНайти(Область.Текст, "[" + ТекущиеДанные.ПредставлениеПутиКДанным + ".") > 0
				Или СтрНайти(Область.Текст, "[" + ТекущиеДанные.ПредставлениеПутиКДанным + "]") > 0 Тогда
				ПодсвеченныеОбласти.Добавить(Область.ЦветФона, Область.Имя);
				Область.ЦветФона = ЦветФонаВыделенияПоля;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьПодсветку()
	
	Для Каждого Элемент Из ПодсвеченныеОбласти Цикл
		ЦветФона = Элемент.Значение;
		ИмяОбласти = Элемент.Представление;
		
		Область = ТабличныйДокумент.Область(ИмяОбласти);
		Область.ЦветФона = ЦветФона;
	КонецЦикла;
	
	ПодсвеченныеОбласти.Очистить();
	
КонецПроцедуры

&НаКлиенте
Процедура ДоступныеПоля(Команда)
	
	Элементы.КнопкаДоступныеПоля.Пометка = Не Элементы.КнопкаДоступныеПоля.Пометка;
	Элементы.ГруппаПоляИОператоры.Видимость = Элементы.КнопкаДоступныеПоля.Пометка;
	
КонецПроцедуры

&НаКлиенте
Процедура ОтобразитьСостояниеТекущейПечатнойФормы(ТекстСостояния = "")
	
	ОтображатьСостояние = Не ПустаяСтрока(ТекстСостояния);
	
	ПолеТабличногоДокумента = Элементы.ТабличныйДокумент;
	
	ОтображениеСостояния = ПолеТабличногоДокумента.ОтображениеСостояния;
	ОтображениеСостояния.Текст = ТекстСостояния;
	ОтображениеСостояния.Видимость = ОтображатьСостояние;
	ОтображениеСостояния.ДополнительныйРежимОтображения = 
		?(ОтображатьСостояние, ДополнительныйРежимОтображения.Неактуальность, ДополнительныйРежимОтображения.НеИспользовать);
		
	ПолеТабличногоДокумента.ТолькоПросмотр = ОтображатьСостояние Или ПолеТабличногоДокумента.Вывод = ИспользованиеВывода.Запретить;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьОбластьНастройкиВыбранныхЯчеек()
	ОбновитьПолеВводаЗначенияТекущейЯчейки();
КонецПроцедуры

&НаКлиенте
Процедура ПовторятьНаКаждойСтранице(Команда)
	
	ТекущаяОбласть = ТабличныйДокумент.ТекущаяОбласть;
	Если ТекущаяОбласть = Неопределено Или ТипЗнч(ТекущаяОбласть) <> Тип("ОбластьЯчеекТабличногоДокумента")
		Или ТекущаяОбласть.ТипОбласти <> ТипОбластиЯчеекТабличногоДокумента.Строки Тогда
		Возврат;
	КонецЕсли;

	Элементы.ПовторятьВНачалеСтраницы.Пометка = Не Элементы.ПовторятьВНачалеСтраницы.Пометка;
	ТекущаяОбласть.НачалоСтраницы = Элементы.ПовторятьВНачалеСтраницы.Пометка;
	
КонецПроцедуры

&НаКлиенте
Процедура ПовторятьВКонцеСтраницы(Команда)
	
	ТекущаяОбласть = ТабличныйДокумент.ТекущаяОбласть;
	Если ТекущаяОбласть = Неопределено Или ТипЗнч(ТекущаяОбласть) <> Тип("ОбластьЯчеекТабличногоДокумента")
		Или ТекущаяОбласть.ТипОбласти <> ТипОбластиЯчеекТабличногоДокумента.Строки Тогда
		Возврат;
	КонецЕсли;

	Элементы.ПовторятьВКонцеСтраницы.Пометка = Не Элементы.ПовторятьВКонцеСтраницы.Пометка;
	ТекущаяОбласть.КонецСтраницы = Элементы.ПовторятьВКонцеСтраницы.Пометка;
	
КонецПроцедуры

&НаКлиенте
Процедура ТекущееЗначениеПриИзменении(Элемент)
	
	ОбновитьТекстВОбластиЯчеек();
	ПолучательПеретаскиваемогоЗначения = Элемент;
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция КоллекцииПолей(ИсточникиДанных, ПараметрыРедактирования)
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
		Попытка
			Возврат МодульУправлениеПечатью.КоллекцииПолейИсточниковДанных(ИсточникиДанных);
		Исключение
			РазблокироватьДанныеДляРедактирования(ПараметрыРедактирования.КлючОбъектаРедактирования, ПараметрыРедактирования.УникальныйИдентификатор);
			ВызватьИсключение ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		КонецПопытки
	КонецЕсли;

	Возврат Новый Массив;
	
КонецФункции

&НаСервере
Функция СписокОператоров()
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
		Возврат МодульУправлениеПечатью.СписокОператоров();
	КонецЕсли;
	
КонецФункции

#Область ПодключаемыйСписокПолей

&НаКлиенте
Процедура Подключаемый_СписокПолейПередРазворачиванием(Элемент, Строка, Отказ)
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда
		МодульКонструкторФормулКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("КонструкторФормулКлиент");
		МодульКонструкторФормулКлиент.СписокПолейПередРазворачиванием(ЭтотОбъект, Элемент, Строка, Отказ);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_РазвернутьТекущийЭлементСпискаПолей()
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда
		МодульКонструкторФормулКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("КонструкторФормулКлиент");
		МодульКонструкторФормулКлиент.РазвернутьТекущийЭлементСпискаПолей(ЭтотОбъект);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ЗаполнитьСписокДоступныхПолей(ПараметрыЗаполнения) Экспорт // АПК:78 - вызывается из КонструкторФормулКлиент
	
	ЗаполнитьСписокДоступныхПолей(ПараметрыЗаполнения);
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьСписокДоступныхПолей(ПараметрыЗаполнения)
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда
		МодульКонструкторФормул = ОбщегоНазначения.ОбщийМодуль("КонструкторФормул");
		МодульКонструкторФормул.ЗаполнитьСписокДоступныхПолей(ЭтотОбъект, ПараметрыЗаполнения);
		
		Если ПараметрыЗаполнения.ИмяСписка = ИмяСпискаПолей() Тогда
			ТекущиеДанные = ЭтотОбъект[ПараметрыЗаполнения.ИмяСписка].НайтиПоИдентификатору(ПараметрыЗаполнения.ИдентификаторСтроки);
			УстановитьПримерыЗначений(ТекущиеДанные);
			УстановитьФорматЗначенийПоУмолчанию(ТекущиеДанные);
			Если (ТекущиеДанные.Папка Или ТекущиеДанные.Таблица) И ТекущиеДанные.ПолучитьРодителя() = Неопределено Тогда
				ОтметитьОбщиеПоля(ТекущиеДанные);
			Иначе
				УстановитьПризнакОбщегоПоляДляПодчиненныхПолей(ТекущиеДанные);
			КонецЕсли;
		КонецЕсли
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_СписокПолейНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, Выполнение)
	
	Реквизит = ЭтотОбъект[ИмяСпискаПолей()].НайтиПоИдентификатору(ПараметрыПеретаскивания.Значение);
	
	Если Реквизит.Папка Или Реквизит.Таблица 
		Или Элементы.ПоказыватьКолонтитулы.Пометка
		И Не СтрНачинаетсяС(Реквизит.ПутьКДанным, "ОбщиеРеквизиты.") Тогда
		Выполнение = Ложь;
		Возврат;
	КонецЕсли;
	
	ПараметрыПеретаскивания.Значение = "[" + Реквизит.ПредставлениеПутиКДанным + "]";

	Если Элемент = Элементы[ИмяСпискаПолей()]
		И ЗначениеЗаполнено(Реквизит.Формат) И Реквизит.Формат <> Реквизит.ФорматПоУмолчанию Тогда
		
		ПараметрыПеретаскивания.Значение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			"[Формат(%1, %2)]", ПараметрыПеретаскивания.Значение, """" + Реквизит.Формат + """");
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_СтрокаПоискаИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда
		МодульКонструкторФормулКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("КонструкторФормулКлиент");
		МодульКонструкторФормулКлиент.СтрокаПоискаИзменениеТекстаРедактирования(ЭтотОбъект, Элемент, Текст, СтандартнаяОбработка);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ВыполнитьПоискВСпискеПолей()
	
	ВыполнитьПоискВСпискеПолей();
	
КонецПроцедуры

&НаСервере
Процедура ВыполнитьПоискВСпискеПолей()
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда
		МодульКонструкторФормул = ОбщегоНазначения.ОбщийМодуль("КонструкторФормул");
		МодульКонструкторФормул.ВыполнитьПоискВСпискеПолей(ЭтотОбъект);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_СтрокаПоискаОчистка(Элемент, СтандартнаяОбработка)
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда
		МодульКонструкторФормулКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("КонструкторФормулКлиент");
		МодульКонструкторФормулКлиент.СтрокаПоискаОчистка(ЭтотОбъект, Элемент, СтандартнаяОбработка);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура Подключаемый_ОбработчикКонструктораФормулСервер(Параметр, ДополнительныеПараметры)
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда
		МодульКонструкторФормул = ОбщегоНазначения.ОбщийМодуль("КонструкторФормул");
		МодульКонструкторФормул.ОбработчикКонструктораФормул(ЭтотОбъект, Параметр, ДополнительныеПараметры);
	КонецЕсли;          
	
	Если ДополнительныеПараметры.КлючОперации = "ОбработатьСообщениеПоиска" Тогда
		ОтметитьОбщиеПоля();
		УстановитьФорматЗначенийПоУмолчанию();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОбработчикКонструктораФормулКлиент(Параметр, ДополнительныеПараметры = Неопределено) Экспорт // АПК:78 Процедура вызывается из КонструкторФормулКлиент.НачатьПоискВСпискеПолей
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда
		МодульКонструкторФормулКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("КонструкторФормулКлиент");
		МодульКонструкторФормулКлиент.ОбработчикКонструктораФормул(ЭтотОбъект, Параметр, ДополнительныеПараметры);
		Если ДополнительныеПараметры <> Неопределено И ДополнительныеПараметры.ВыполнитьНаСервере Тогда
			Подключаемый_ОбработчикКонструктораФормулСервер(Параметр, ДополнительныеПараметры);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_НачатьПоискВСпискеПолей()

	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда
		МодульКонструкторФормулКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("КонструкторФормулКлиент");
		МодульКонструкторФормулКлиент.НачатьПоискВСпискеПолей(ЭтотОбъект);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ИмяСпискаПолей()
	
	Возврат "ДоступныеПоля";
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ИмяСпискаОператоров()
	
	Возврат "СписокОператоров";
	
КонецФункции

#КонецОбласти

#Область ДополнительныеОбработчикиПодключаемыхСписков

// Параметры:
//  Элемент - ТаблицаФормы
//  ВыбраннаяСтрока - Число
//  Поле - ПолеФормы
//  СтандартнаяОбработка - Булево
//
&НаКлиенте
Процедура Подключаемый_СписокПолейВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	МодульКонструкторФормулКлиент = Неопределено;
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда
		МодульКонструкторФормулКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("КонструкторФормулКлиент");
	Иначе
		Возврат;
	КонецЕсли;
	
	Если Поле.Имя = Элемент.Имя + "Представление" Тогда
		СтандартнаяОбработка = Ложь;
		ВыбранноеПоле = МодульКонструкторФормулКлиент.ВыбранноеПолеВСпискеПолей(ЭтотОбъект);
		Если ЗначениеЗаполнено(ТекущееЗначение) Тогда
			ТекущееЗначение = СокрП(ТекущееЗначение) + " ";
		Иначе
			ТекущееЗначение = "";
		КонецЕсли;
		Если Элемент.Имя = ИмяСпискаПолей() Тогда
			ТекущееЗначение = ТекущееЗначение + "[" + ВыбранноеПоле.ПредставлениеПутиКДанным + "]";
		Иначе
			ТекущееЗначение = ТекущееЗначение + МодульКонструкторФормулКлиент.ВыражениеДляВставки(ВыбранноеПоле);
		КонецЕсли;
		
		ОбновитьТекстВОбластиЯчеек();
	КонецЕсли;
	
	Если Поле = Элементы[ИмяСпискаПолей() + "КнопкаНастройкиФормата"] И ЗначениеЗаполнено(Элементы[ИмяСпискаПолей()].ТекущиеДанные.Формат) Тогда
		СтандартнаяОбработка = Ложь;
		Конструктор = Новый КонструкторФорматнойСтроки(Элементы[ИмяСпискаПолей()].ТекущиеДанные.Формат);
		Конструктор.ДоступныеТипы = Элементы[ИмяСпискаПолей()].ТекущиеДанные.Тип;
		ОписаниеОповещения = Новый ОписаниеОповещения("ПриВыбореФорматаПоля", ЭтотОбъект);
		Конструктор.Показать(ОписаниеОповещения);
	КонецЕсли;	
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОператорыНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, Выполнение)
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда
		МодульКонструкторФормулКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("КонструкторФормулКлиент");
		
		Оператор = МодульКонструкторФормулКлиент.ВыбранноеПолеВСпискеПолей(ЭтотОбъект, ИмяСпискаОператоров());
		ПараметрыПеретаскивания.Значение = МодульКонструкторФормулКлиент.ВыражениеДляВставки(Оператор);
		Если Оператор.ПутьКДанным = "УправлениеПечатью_КоличествоСтрок" Тогда
			ПредставлениеТекущейТаблицы = ПредставлениеТекущейТаблицы();
			Выполнение = ПредставлениеТекущейТаблицы <> Неопределено;
			ПараметрыПеретаскивания.Значение = СтрЗаменить(ПараметрыПеретаскивания.Значение, "()", "(["+ПредставлениеТекущейТаблицы+"])");
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОператорыОкончаниеПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда
		МодульКонструкторФормулКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("КонструкторФормулКлиент");
		ВыбранноеПоле = МодульКонструкторФормулКлиент.ВыбранноеПолеВСпискеПолей(ЭтотОбъект, ИмяСпискаОператоров());
		Контекст = Новый Структура("ПутьКДанным, Заголовок");
		ЗаполнитьЗначенияСвойств(Контекст, ВыбранноеПоле);
		
		Если Контекст.ПутьКДанным = "Формат" Тогда
			ФорматСтроки = Новый КонструкторФорматнойСтроки;
			Контекст.Вставить("ФорматСтроки", ФорматСтроки);
			ОповещениеОкончанияПеретаскиванияЗавершение = Новый ОписаниеОповещения("ОператорыОкончаниеПеретаскиванияЗавершение", ЭтотОбъект, Контекст);
			ФорматСтроки.Показать(ОповещениеОкончанияПеретаскиванияЗавершение);
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОператорыОкончаниеПеретаскиванияЗавершение(Текст, Контекст) Экспорт
	
	Если Текст = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ТекстыДляЗамены = Новый Структура("ДляПоиска, ДляЗамены", "", "");
	
	Если Контекст.ПутьКДанным = "Формат" Тогда
		ФорматСтроки = Контекст.ФорматСтроки;
		Если ЗначениеЗаполнено(ФорматСтроки.Текст) Тогда
			ТекстыДляЗамены.ДляЗамены = Контекст.Заголовок + "( , """ + ФорматСтроки.Текст + """)";
			ТекстыДляЗамены.ДляПоиска = Контекст.Заголовок + "(,,)";
		КонецЕсли;
	КонецЕсли;
	
	АдресПараметровДляОбработкиОжидания = ПоместитьВоВременноеХранилище(ТекстыДляЗамены, УникальныйИдентификатор);
	
	ПодключитьОбработчикОжидания("УстановитьЗначениеПослеПеретаскивания", 0.1, Истина);
	
КонецПроцедуры

#КонецОбласти

&НаКлиенте
Процедура УстановитьЗначениеПослеПеретаскивания()
	
	ТекстыДляЗамены = ПолучитьИзВременногоХранилища(АдресПараметровДляОбработкиОжидания);
	
	Если ПолучательПеретаскиваемогоЗначения = Элементы.ТекущееЗначение ИЛИ ПолучательПеретаскиваемогоЗначения = Неопределено Тогда
		Элементы.ТекущееЗначение.ВыделенныйТекст = ТекстыДляЗамены.ДляЗамены;
	Иначе
		ТекущийРеквизит = ЭтотОбъект[ПолучательПеретаскиваемогоЗначения.Имя];
		Если ТипЗнч(ТекущийРеквизит) = Тип("ФорматированныйДокумент") Тогда
			ТекстДляРазмещения = СтрЗаменить(ТекущийРеквизит.ПолучитьТекст(), ТекстыДляЗамены.ДляПоиска, ТекстыДляЗамены.ДляЗамены);
			ФорматированныйТекст = Новый ФорматированнаяСтрока(ТекстДляРазмещения);
			ТекущийРеквизит.Удалить();
			ТекущийРеквизит.УстановитьФорматированнуюСтроку(ФорматированныйТекст);
		ИначеЕсли ТипЗнч(ТекущийРеквизит) = Тип("ТабличныйДокумент") Тогда
			ТекущийРеквизит.ТекущаяОбласть.Текст = СтрЗаменить(ТекущийРеквизит.ТекущаяОбласть.Текст, ТекстыДляЗамены.ДляПоиска, ТекстыДляЗамены.ДляЗамены);
		Иначе
			ТекущийРеквизит = СтрЗаменить(ТекущийРеквизит, ТекстыДляЗамены.ДляПоиска, ТекстыДляЗамены.ДляЗамены);
		КонецЕсли;
	КонецЕсли;
	ПолучательПеретаскиваемогоЗначения = Неопределено;
КонецПроцедуры

&НаКлиенте
Функция ПредставлениеТекущейТаблицы()
	Для Каждого ПодключенныйСписокПолей Из ЭтотОбъект["ПодключенныеСпискиПолей"] Цикл
		Если ПодключенныйСписокПолей.ИмяСпискаПолей <> ИмяСпискаОператоров() Тогда
			Если Элементы[ПодключенныйСписокПолей.ИмяСпискаПолей].ТекущиеДанные <> Неопределено
				И Элементы[ПодключенныйСписокПолей.ИмяСпискаПолей].ТекущиеДанные.Таблица Тогда
					Возврат Элементы[ПодключенныйСписокПолей.ИмяСпискаПолей].ТекущиеДанные.ПредставлениеПутиКДанным;
			КонецЕсли;			
		КонецЕсли;
	КонецЦикла;	
	Возврат Неопределено;
КонецФункции

&НаСервере
Процедура ЗаписатьМакетыНаДополнительныхЯзыках()
	
	ПараметрыМакета = Новый Структура;
	ПараметрыМакета.Вставить("ИдентификаторКопируемогоМакета", ИдентификаторКопируемогоМакета);
	ПараметрыМакета.Вставить("ТекущийЯзык", ТекущийЯзык);
	ПараметрыМакета.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
	ПараметрыМакета.Вставить("ИдентификаторМакета", ИдентификаторМакета);
	ПараметрыМакета.Вставить("ВладелецМакета", ВладелецМакета);
	ПараметрыМакета.Вставить("ИмяДокумента", ИмяДокумента);
	ПараметрыМакета.Вставить("СсылкаМакета", СсылкаМакета);
	ПараметрыМакета.Вставить("ТипМакета", "MXL");
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
		МодульУправлениеПечатью.ЗаписатьМакетыНаДополнительныхЯзыках(ПараметрыМакета);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция ПодготовитьМакетДляЗаписи(УстановитьКодЯзыка = Истина, Отказ = Ложь)

	КодЯзыка = Неопределено;
	Если УстановитьКодЯзыка Тогда
		КодЯзыка = ТабличныйДокумент.КодЯзыка;
	КонецЕсли;
	
	Макет = СкопироватьТабличныйДокумент(ТабличныйДокумент, КодЯзыка);
	Если Не ЭтоПечатнаяФорма Тогда
		Возврат Макет;
	КонецЕсли;
	
	ОбработанныеОбласти = Новый Соответствие();
	
	Для НомерСтроки = 1 По Макет.ВысотаТаблицы Цикл
		Для НомерКолонки = 1 По Макет.ШиринаТаблицы Цикл
			Область = Макет.Область(НомерСтроки, НомерКолонки);
			
			Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
				МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
				ИдентификаторОбласти = МодульУправлениеПечатью.ИдентификаторОбласти(Область);
				Если ОбработанныеОбласти[ИдентификаторОбласти] <> Неопределено Тогда
					Продолжить;
				КонецЕсли;
				ОбработанныеОбласти[ИдентификаторОбласти] = Истина;
			КонецЕсли;
			
			Если ЗначениеЗаполнено(Область.Текст) Тогда
				ПредставлениеПоля = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'стр. %1 кол. %2'"), НомерСтроки, НомерКолонки);
				ЗаменитьПредставленияПараметров(Область.Текст, , Отказ, ПредставлениеПоля);
			КонецЕсли;
			
		КонецЦикла;
	КонецЦикла;
	
	ЗаменитьПредставленияПараметров(Макет.ВерхнийКолонтитул.ТекстСлева, "ТекстСлеваСверху", Отказ, НСтр("ru = 'верхний колонтитул слева'"));
	ЗаменитьПредставленияПараметров(Макет.ВерхнийКолонтитул.ТекстВЦентре, "ТекстВЦентреСверху", Отказ, НСтр("ru = 'верхний колонтитул в центре'"));
	ЗаменитьПредставленияПараметров(Макет.ВерхнийКолонтитул.ТекстСправа, "ТекстСправаСверху", Отказ, НСтр("ru = 'верхний колонтитул справа'"));
	ЗаменитьПредставленияПараметров(Макет.НижнийКолонтитул.ТекстСлева, "ТекстСлеваСнизу", Отказ, НСтр("ru = 'нижний колонтитул слева'"));
	ЗаменитьПредставленияПараметров(Макет.НижнийКолонтитул.ТекстВЦентре, "ТекстВЦентреСнизу", Отказ, НСтр("ru = 'нижний колонтитул в центре'"));
	ЗаменитьПредставленияПараметров(Макет.НижнийКолонтитул.ТекстСправа, "ТекстСправаСнизу", Отказ, НСтр("ru = 'нижний колонтитул справа'"));
	
	Для Каждого Область Из Макет.Области Цикл
		Если ТипЗнч(Область) = Тип("ОбластьЯчеекТабличногоДокумента")
			И Область.ТипОбласти = ТипОбластиЯчеекТабличногоДокумента.Строки Тогда
			ЗаменитьПредставленияПараметров(Область.ПараметрРасшифровки, , Отказ, Область.Имя);
		КонецЕсли;
	КонецЦикла;
	
	Возврат Макет;
	
КонецФункции

&НаСервере
Процедура ЗаменитьПредставленияПараметров(Строка, Поле = Неопределено, Отказ = Ложь, ПредставлениеПоля = "")
	
	ПараметрыЗамены = ФормулыИзТекста(Строка(Строка));
	
	Для Каждого Параметр Из ПараметрыЗамены Цикл
		Формула = Параметр.Ключ;
		Если СтрЧислоВхождений(Формула, "[") > 1 Тогда
			Формула = Сред(Формула, 2, СтрДлина(Формула) - 2);
		КонецЕсли;		
		
		ТекстОшибки = "";
		Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда
			МодульКонструкторФормулСлужебный = ОбщегоНазначения.ОбщийМодуль("КонструкторФормулСлужебный");
			ТекстОшибки = МодульКонструкторФормулСлужебный.ПроверитьФормулу(ЭтотОбъект, Формула);
		КонецЕсли;
			
		Если ЗначениеЗаполнено(ТекстОшибки) Тогда
			Если ЗначениеЗаполнено(ПредставлениеПоля) Тогда
				ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = '%1 (%2)'"),
					ТекстОшибки,
					ПредставлениеПоля);
			КонецЕсли;
			
			ОбщегоНазначения.СообщитьПользователю(ТекстОшибки, , Поле, , Отказ);
		КонецЕсли;
	КонецЦикла;
	
	Если ТипЗнч(Строка) = Тип("ФорматированнаяСтрока") Тогда
		Строка = ЗаменитьВФорматированнойСтроке(Строка, ПараметрыЗамены);
	Иначе
		Строка = ЗаменитьВСтроке(Строка, ПараметрыЗамены);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция ЗаменитьВСтроке(Знач Строка, ПараметрыЗамены)
	
	Для Каждого Элемент Из ПараметрыЗамены Цикл
		ПодстрокаПоиска = Элемент.Ключ;
		ПодстрокаЗамены = Элемент.Значение;
		Строка = СтрЗаменить(Строка, ПодстрокаПоиска, ПодстрокаЗамены);
	КонецЦикла;
	
	Возврат Строка;
	
КонецФункции

&НаСервере
Функция ЗаменитьВФорматированнойСтроке(Строка, ПараметрыЗамены)

	ФорматированныйДокумент = Новый ФорматированныйДокумент;
	ФорматированныйДокумент.УстановитьФорматированнуюСтроку(Строка);
	
	Для Каждого Элемент Из ПараметрыЗамены Цикл
		ПодстрокаПоиска = Элемент.Ключ;
		ПодстрокаЗамены = Элемент.Значение;

		НайденнаяОбласть = ФорматированныйДокумент.НайтиТекст(ПодстрокаПоиска);
		Пока НайденнаяОбласть <> Неопределено Цикл
			Фрагменты = ФорматированныйДокумент.СформироватьЭлементы(НайденнаяОбласть.ЗакладкаНачала, НайденнаяОбласть.ЗакладкаКонца);
			Для Индекс = 1 По Фрагменты.ВГраница() Цикл
				Фрагменты[0].Текст = Фрагменты[0].Текст + Фрагменты[Индекс].Текст;
				Фрагменты[Индекс].Текст = "";
			КонецЦикла;
			Фрагменты[0].Текст = СтрЗаменить(Фрагменты[0].Текст, ПодстрокаПоиска, ПодстрокаЗамены);
	
			НайденнаяОбласть = ФорматированныйДокумент.НайтиТекст(ПодстрокаПоиска, НайденнаяОбласть.ЗакладкаКонца);
		КонецЦикла;
	КонецЦикла;
	
	Возврат ФорматированныйДокумент.ПолучитьФорматированнуюСтроку();

КонецФункции

&НаСервере
Функция ФормулыИзТекста(Знач Текст)
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
		Возврат МодульУправлениеПечатью.ФормулыИзТекста(Текст, ЭтотОбъект);
	КонецЕсли;
	
КонецФункции

&НаСервере
Функция ПредставленияПараметровТекста(Знач Текст)
	
	Результат = Новый Соответствие();
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
		Возврат МодульУправлениеПечатью.ПредставленияПараметровТекста(Текст, ЭтотОбъект);
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

&НаСервере
Функция ПрочитатьМакет(ДвоичныеДанные = Неопределено)
	
	КодЯзыка = ТабличныйДокумент.КодЯзыка;
	
	Если ДвоичныеДанные <> Неопределено Тогда
		ТабличныйДокумент.КодЯзыка = Неопределено;
		ТабличныйДокумент.Прочитать(ДвоичныеДанные.ОткрытьПотокДляЧтения());
	КонецЕсли;
	
	Макет = СкопироватьТабличныйДокумент(ТабличныйДокумент, КодЯзыка);
	
	Если Не ЭтоПечатнаяФорма Тогда
		Возврат Макет;
	КонецЕсли;
	
	ОбработанныеОбласти = Новый Соответствие();
	
	Для НомерСтроки = 1 По Макет.ВысотаТаблицы Цикл
		Для НомерКолонки = 1 По Макет.ШиринаТаблицы Цикл
			Область = Макет.Область(НомерСтроки, НомерКолонки);

			Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
				МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
				ИдентификаторОбласти = МодульУправлениеПечатью.ИдентификаторОбласти(Область);
				Если ОбработанныеОбласти[ИдентификаторОбласти] <> Неопределено Тогда
					Продолжить;
				КонецЕсли;
				ОбработанныеОбласти[ИдентификаторОбласти] = Истина;
			КонецЕсли;
			
			Если ЗначениеЗаполнено(Область.Текст) Тогда
				ЗаменитьПараметрыПредставлениями(Область.Текст);
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
	ЗаменитьПараметрыПредставлениями(Макет.ВерхнийКолонтитул.ТекстСлева);
	ЗаменитьПараметрыПредставлениями(Макет.ВерхнийКолонтитул.ТекстВЦентре);
	ЗаменитьПараметрыПредставлениями(Макет.ВерхнийКолонтитул.ТекстСправа);
	ЗаменитьПараметрыПредставлениями(Макет.НижнийКолонтитул.ТекстСлева);
	ЗаменитьПараметрыПредставлениями(Макет.НижнийКолонтитул.ТекстВЦентре);
	ЗаменитьПараметрыПредставлениями(Макет.НижнийКолонтитул.ТекстСправа);
	
	Для Каждого Область Из Макет.Области Цикл
		Если ТипЗнч(Область) = Тип("ОбластьЯчеекТабличногоДокумента")
			И Область.ТипОбласти = ТипОбластиЯчеекТабличногоДокумента.Строки Тогда
			ЗаменитьПараметрыПредставлениями(Область.ПараметрРасшифровки);
		КонецЕсли;
	КонецЦикла;
	
	Возврат Макет;
	
КонецФункции

&НаСервере
Процедура ЗаменитьПараметрыПредставлениями(Строка)
	
	ПараметрыЗамены = ПредставленияПараметровТекста(Строка(Строка));
	
	Если ТипЗнч(Строка) = Тип("ФорматированнаяСтрока") Тогда
		Строка = ЗаменитьВФорматированнойСтроке(Строка, ПараметрыЗамены);
	Иначе
		Строка = ЗаменитьВСтроке(Строка, ПараметрыЗамены);
	КонецЕсли;
	
КонецПроцедуры

// Возвращаемое значение:
//  ТабличныйДокумент
//
&НаСервереБезКонтекста
Функция СкопироватьТабличныйДокумент(ТабличныйДокумент, КодЯзыка)
	
	Результат = Новый ТабличныйДокумент;
	Результат.Макет = ТабличныйДокумент.Макет;
	Результат.КодЯзыка = КодЯзыка;
	Результат.Вывести(ТабличныйДокумент);

	ОбработанныеЯчейки = Новый Соответствие;
	Для НомерСтроки = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл
		Для НомерСтолбца = 1 По ТабличныйДокумент.ШиринаТаблицы Цикл
			КопируемаяЯчейка = ТабличныйДокумент.Область(НомерСтроки, НомерСтолбца, НомерСтроки, НомерСтолбца);
			
			Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
				МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
				ИдентификаторОбласти = МодульУправлениеПечатью.ИдентификаторОбласти(КопируемаяЯчейка);
				Если ОбработанныеЯчейки[ИдентификаторОбласти] <> Неопределено Тогда
					Продолжить;
				КонецЕсли;
				ОбработанныеЯчейки[ИдентификаторОбласти] = Истина;
			КонецЕсли;
			
			Если КопируемаяЯчейка.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Текст Тогда
				Продолжить;
			КонецЕсли;
			
			Ячейка = Результат.Область(НомерСтроки, НомерСтолбца, НомерСтроки, НомерСтолбца);
			ЗаполнитьЗначенияСвойств(Ячейка, КопируемаяЯчейка);
			
			Если КопируемаяЯчейка.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Шаблон Тогда
				Ячейка.Текст = КопируемаяЯчейка.Текст;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
	Результат.ВерхнийКолонтитул.ТекстСлева = ТабличныйДокумент.ВерхнийКолонтитул.ТекстСлева;
	Результат.ВерхнийКолонтитул.ТекстВЦентре = ТабличныйДокумент.ВерхнийКолонтитул.ТекстВЦентре;
	Результат.ВерхнийКолонтитул.ТекстСправа = ТабличныйДокумент.ВерхнийКолонтитул.ТекстСправа;
	Результат.НижнийКолонтитул.ТекстСлева = ТабличныйДокумент.НижнийКолонтитул.ТекстСлева;
	Результат.НижнийКолонтитул.ТекстВЦентре = ТабличныйДокумент.НижнийКолонтитул.ТекстВЦентре;
	Результат.НижнийКолонтитул.ТекстСправа = ТабличныйДокумент.НижнийКолонтитул.ТекстСправа;
	
	Для Каждого Область Из Результат.Области Цикл
		Если ТипЗнч(Область) = Тип("ОбластьЯчеекТабличногоДокумента")
			И Область.ТипОбласти = ТипОбластиЯчеекТабличногоДокумента.Строки
			Или ТипЗнч(Область) = Тип("РисунокТабличногоДокумента") 
			И Область.ТипРисунка <> ТипРисункаТабличногоДокумента.Группа Тогда
				КопируемаяОбласть = ТабличныйДокумент.Области.Найти(Область.Имя);
				Если КопируемаяОбласть = Неопределено Тогда
					Продолжить;
				КонецЕсли;
				Область.ПараметрРасшифровки = КопируемаяОбласть.ПараметрРасшифровки;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции	

&НаКлиентеНаСервереБезКонтекста
Процедура ПрочитатьТекстВПолеКолонтитула(Знач Текст, Колонтитул)
	
	ФорматированнаяСтрока = Текст;
	Если ТипЗнч(Текст)  = Тип("Строка") Тогда
		ФорматированнаяСтрока = Новый ФорматированнаяСтрока(Текст);
	КонецЕсли;

	Колонтитул.УстановитьФорматированнуюСтроку(ФорматированнаяСтрока);
	
КонецПроцедуры

&НаКлиенте
Процедура ПереключитьВидимостьКомандКолонтитулов()
	
	Если ТекущийЭлемент = Элементы.ТекстСлеваСверху
		Или ТекущийЭлемент = Элементы.ТекстВЦентреСверху
		Или ТекущийЭлемент = Элементы.ТекстСправаСверху
		Или ТекущийЭлемент = Элементы.ТекстСлеваСнизу
		Или ТекущийЭлемент = Элементы.ТекстВЦентреСнизу
		Или ТекущийЭлемент = Элементы.ТекстСправаСнизу Тогда
	
		ПереключитьВидимостьЭлемента(Элементы.КомандыТекстаСлеваВерхнегоКолонтитула, ТекущийЭлемент = Элементы.ТекстСлеваСверху);
		ПереключитьВидимостьЭлемента(Элементы.КомандыТекстаВЦентреВерхнегоКолонтитула, ТекущийЭлемент = Элементы.ТекстВЦентреСверху);
		ПереключитьВидимостьЭлемента(Элементы.КомандыТекстаСправаВерхнегоКолонтитула, ТекущийЭлемент = Элементы.ТекстСправаСверху);

		ПереключитьВидимостьЭлемента(Элементы.КомандыТекстаСлеваНижнегоКолонтитула, ТекущийЭлемент = Элементы.ТекстСлеваСнизу);
		ПереключитьВидимостьЭлемента(Элементы.КомандыТекстаВЦентреНижнегоКолонтитула, ТекущийЭлемент = Элементы.ТекстВЦентреСнизу);
		ПереключитьВидимостьЭлемента(Элементы.КомандыТекстаСправаНижнегоКолонтитула, ТекущийЭлемент = Элементы.ТекстСправаСнизу);
	
	КонецЕсли;
	
	ПодключитьОбработчикОжидания("ПереключитьВидимостьКомандКолонтитулов", 0.5, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ПереключитьВидимостьЭлемента(Элемент, Видимость)
	
	Если Элемент.Видимость <> Видимость Тогда
		Элемент.Видимость = Видимость;
	КонецЕсли;

КонецПроцедуры

&НаСервере
Функция ЗаписатьМакет(ПрерватьЗаписьПриНаличииОшибокВМакете = Ложь, АдресМакетаВоВременномХранилище = "")
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		Отказ = Ложь;

		Если Не ЗначениеЗаполнено(АдресМакетаВоВременномХранилище) Тогда
			Если ЭтоПечатнаяФорма Тогда
				Макет = ПодготовитьМакетДляЗаписи(, Отказ);
			Иначе
				Макет = ТабличныйДокумент;
			КонецЕсли;
			
			АдресМакетаВоВременномХранилище = ПоместитьВоВременноеХранилище(Макет, УникальныйИдентификатор);
		КонецЕсли;
		
		Если Отказ И ПрерватьЗаписьПриНаличииОшибокВМакете Тогда
			Возврат Ложь;
		КонецЕсли;
		
		МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
		ОписаниеМакета = МодульУправлениеПечатью.ОписаниеМакета();
		ОписаниеМакета.ИмяОбъектаМетаданныхМакета = ИдентификаторМакета;
		ОписаниеМакета.АдресМакетаВоВременномХранилище = АдресМакетаВоВременномХранилище;
		ОписаниеМакета.КодЯзыка = ТекущийЯзык;
		ОписаниеМакета.Наименование = ИмяДокумента;
		ОписаниеМакета.Ссылка = СсылкаМакета;
		ОписаниеМакета.ТипМакета = "MXL";
		ОписаниеМакета.ИсточникиДанных = ИсточникиДанных.ВыгрузитьЗначения();
		
		ИдентификаторМакета = МодульУправлениеПечатью.ЗаписатьМакет(ОписаниеМакета);
		Если Не ЗначениеЗаполнено(СсылкаМакета) Тогда
			СсылкаМакета = МодульУправлениеПечатью.СсылкаМакета(ИдентификаторМакета);
		КонецЕсли;
		
		ЗаписатьМакетыНаДополнительныхЯзыках();
		
		Если Не Элементы.Язык.Доступность Тогда
			Элементы.Язык.Доступность  = Истина;
		КонецЕсли;
	КонецЕсли;
	
	Возврат Истина;
	
КонецФункции

&НаСервере
Процедура РасширитьСписокПолей()
	
	ДобавляемыеРеквизиты = Новый Массив;
	ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Образец", Новый ОписаниеТипов, ИмяСпискаПолей()));
	ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Формат", Новый ОписаниеТипов("Строка"), ИмяСпискаПолей()));
	ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ФорматПоУмолчанию", Новый ОписаниеТипов("Строка"), ИмяСпискаПолей()));
	ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("КнопкаНастройкиФормата", Новый ОписаниеТипов("Число"), ИмяСпискаПолей()));
	ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Значение", Новый ОписаниеТипов, ИмяСпискаПолей()));
	ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Общее", Новый ОписаниеТипов("Булево"), ИмяСпискаПолей()));
	
	ИзменитьРеквизиты(ДобавляемыеРеквизиты);
	
	СписокПолей = Элементы[ИмяСпискаПолей()];
	СписокПолей.Шапка = Истина;
	СписокПолей.УстановитьДействие("ПриАктивизацииСтроки", "Подключаемый_ДоступныеПоляПриАктивизацииСтроки");
	
	ИмяКолонкиПредставление = ИмяСпискаПолей() + "Представление";
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда
		МодульКонструкторФормулСлужебный = ОбщегоНазначения.ОбщийМодуль("КонструкторФормулСлужебный");
		ИмяКолонкиПредставление = МодульКонструкторФормулСлужебный.ИмяКолонкиПредставление(ИмяСпискаПолей());
	КонецЕсли;
	
	КолонкаПредставление = Элементы[ИмяКолонкиПредставление];
	КолонкаПредставление.Заголовок = НСтр("ru = 'Поле'");
	
	КолонкаОбразец = Элементы.Добавить(ИмяСпискаПолей() + "Образец", Тип("ПолеФормы"), СписокПолей);
	КолонкаОбразец.ПутьКДанным = ИмяСпискаПолей() + "." + "Образец";
	КолонкаОбразец.Вид = ВидПоляФормы.ПолеВвода;
	КолонкаОбразец.Заголовок = НСтр("ru = 'Образец'");
	КолонкаОбразец.УстановитьДействие("ПриИзменении", "Подключаемый_ОбразецПриИзменении");
	КолонкаОбразец.ОтображатьВПодвале = Ложь;
	КолонкаОбразец.КнопкаОчистки = Истина;
	
	КнопкаНастройкиФормата = Элементы.Добавить(ИмяСпискаПолей() + "КнопкаНастройкиФормата", Тип("ПолеФормы"), СписокПолей);
	КнопкаНастройкиФормата.ПутьКДанным = ИмяСпискаПолей() + "." + "КнопкаНастройкиФормата";
	КнопкаНастройкиФормата.Вид = ВидПоляФормы.ПолеКартинки;
	КнопкаНастройкиФормата.ОтображатьВШапке = Истина;
	КнопкаНастройкиФормата.КартинкаШапки = БиблиотекаКартинок.ПараметрыВыводаКомпоновкиДанных;	
	КнопкаНастройкиФормата.КартинкаЗначений = БиблиотекаКартинок.ПараметрыВыводаКомпоновкиДанных;	
	КнопкаНастройкиФормата.Заголовок = НСтр("ru = 'Настройка формата'");
	КнопкаНастройкиФормата.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
	КнопкаНастройкиФормата.ГиперссылкаЯчейки = Истина;
	КнопкаНастройкиФормата.ОтображатьВПодвале = Ложь;
	
	УстановитьПримерыЗначений();
	УстановитьФорматЗначенийПоУмолчанию();
	НастроитьПолеОбразец();
	ОтметитьОбщиеПоля();
	
	Для Каждого ЭлементОформления Из УсловноеОформление.Элементы Цикл
		Для Каждого ОформляемоеПоле Из ЭлементОформления.Поля.Элементы Цикл
			Если ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяСпискаПолей() + "Представление") Тогда
				ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
				ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяСпискаПолей() + "Образец");
				ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
				ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяСпискаПолей() + "КнопкаНастройкиФормата");
				Прервать;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
	// Цвет полей, не являющихся общими для выбранных объектов
	
	ЭлементОформления = УсловноеОформление.Элементы.Добавить();
	
	ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
	ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяСпискаПолей());
	
	ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяСпискаПолей() + ".Общее");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = Ложь;
	
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет);	
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ДоступныеПоляПриАктивизацииСтроки(Элемент)
	
	ТекущиеДанные = Элементы[ИмяСпискаПолей()].ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ТекущиеДанные.ПолучитьРодителя() = Неопределено Тогда
		Элементы["СтрокаПоиска" + ИмяСпискаПолей()].ПодсказкаВвода = ПодсказкаВводаСтрокиПоискаСпискаПолей();
	Иначе
		Элементы["СтрокаПоиска" + ИмяСпискаПолей()].ПодсказкаВвода = ТекущиеДанные.ПредставлениеПутиКДанным;
	КонецЕсли;

	СистемнаяИнформация = Новый СистемнаяИнформация;
	ВерсияПлатформы = СистемнаяИнформация.ВерсияПриложения;

	Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияПлатформы, "8.3.23.838") >= 0 Тогда
		ПодключитьОбработчикОжидания("ПодсветитьЯчейкиСВыбраннымПолем", 0.1, Истина);
	Иначе
		#Если Не ВебКлиент Тогда	
			ПодключитьОбработчикОжидания("ПодсветитьЯчейкиСВыбраннымПолем", 0.1, Истина);	
		#КонецЕсли		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ДоступныеПоляПередНачаломИзменения(Элемент, Отказ)
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонструкторФормул") Тогда
		МодульКонструкторФормулКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("КонструкторФормулКлиент");
		
		ТекущиеДанные = Элементы[ИмяСпискаПолей()].ТекущиеДанные;
		ТекущиеДанные.Образец = ТекущиеДанные.Значение;
		ПолеВвода = Элементы[ИмяСпискаПолей() + "Образец"];
		ВыбранноеПоле = МодульКонструкторФормулКлиент.ВыбранноеПолеВСпискеПолей(ЭтотОбъект, ИмяСпискаПолей());
		ПолеВвода.ОграничениеТипа = ВыбранноеПоле.Тип;
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция ЗаполнитьСписокОтображаемыхПолей(КоллекцияПолей, Результат = Неопределено)
	
	Если Результат = Неопределено Тогда
		Результат = Новый Массив;
	КонецЕсли;
	
	Для Каждого Элемент Из КоллекцияПолей.ПолучитьЭлементы() Цикл
		Если Не ЗначениеЗаполнено(Элемент.ПутьКДанным) Тогда
			Продолжить;
		КонецЕсли;
		Результат.Добавить(Элемент.ПутьКДанным);
		ЗаполнитьСписокОтображаемыхПолей(Элемент, Результат);
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

&НаКлиенте
Процедура ПриВыбореФорматаПоля(Формат, ДополнительныеПараметры) Экспорт
	
	Если Формат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ТекущиеДанные = Элементы[ИмяСпискаПолей()].ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	ТекущиеДанные.Формат = Формат;
	ТекущиеДанные.Образец = Формат(ТекущиеДанные.Значение, ТекущиеДанные.Формат);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ДоступныеПоляПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
	
	ТекущиеДанные = Элементы[ИмяСпискаПолей()].ТекущиеДанные;
	Если ЗначениеЗаполнено(ТекущиеДанные.Формат) Тогда
		ТекущиеДанные.Образец = Формат(ТекущиеДанные.Значение, ТекущиеДанные.Формат);
	КонецЕсли;

	Если ТекущиеДанные.ПутьКДанным = "Ссылка" Тогда
		Образец = ТекущиеДанные.Образец;
	КонецЕсли;
	ПодключитьОбработчикОжидания("ПриИзмененииОбразца", 0.1,  Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОбразецПриИзменении(Элемент)
	
	ТекущиеДанные = Элементы[ИмяСпискаПолей()].ТекущиеДанные;
	ТекущиеДанные.Значение = ТекущиеДанные.Образец;
	
КонецПроцедуры

&НаКлиенте
Процедура ПриИзмененииОбразца()

	ПриИзмененииОбразцаНаСервере();
	
КонецПроцедуры

&НаСервере
Процедура ПриИзмененииОбразцаНаСервере()
	
	УстановитьПримерыЗначений();
	
	Если Элементы.СтраницыМакетов.ТекущаяСтраница = Элементы.СтраницаОбразец Тогда
		СформироватьПечатнуюФорму();
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция ПодобратьИмяОбласти(ИмяОбласти)
	
	ИспользованныеИмена = Новый Соответствие;
	
	Для Каждого Область Из ТабличныйДокумент.Области Цикл
		ИспользованныеИмена.Вставить(Область.Имя, Истина);
	КонецЦикла;
	
	Индекс = 1;
	Пока ИспользованныеИмена[ИмяОбласти(ИмяОбласти, Индекс)] <> Неопределено Цикл
		Индекс = Индекс + 1;
	КонецЦикла;
	
	Возврат ИмяОбласти(ИмяОбласти, Индекс);
	
КонецФункции

&НаСервере
Функция ИмяОбласти(ИмяОбласти, Индекс)
	
	Возврат ИмяОбласти + Формат(Индекс, "ЧГ=0");
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ПодсказкаВводаСтрокиПоискаСпискаПолей()
	
	Возврат НСтр("ru = 'Найти поле...'");
	
КонецФункции

&НаКлиенте
Процедура ПосмотретьПечатнуюФорму(Команда)
	
	Если Элементы.ПосмотретьПечатнуюФорму.Пометка Тогда
		Элементы.СтраницыМакетов.ТекущаяСтраница = Элементы.СтраницаМакет;
	Иначе
		Если Не ЗначениеЗаполнено(Образец) Тогда
			Элементы[ИмяСпискаПолей()].ТекущаяСтрока = ЭтотОбъект[ИмяСпискаПолей()].ПолучитьЭлементы()[0].ПолучитьИдентификатор();
			ОбщегоНазначенияКлиент.СообщитьПользователю(
				НСтр("ru = 'Выберите образец, по данным которого будет формироваться печатная форма'"), , ИмяСпискаПолей() + "[0].Образец");
			Возврат;
		КонецЕсли;
		СформироватьПечатнуюФорму();
		Элементы.СтраницыМакетов.ТекущаяСтраница = Элементы.СтраницаОбразец;
	КонецЕсли;
	
	Элементы.ПосмотретьПечатнуюФорму.Пометка = Не Элементы.ПосмотретьПечатнуюФорму.Пометка;
	Элементы.НастройкиТекущейОбласти.Видимость = Не Элементы.ПосмотретьПечатнуюФорму.Пометка;
	Элементы.ВтораяКоманднаяПанель.Доступность = Не Элементы.ПосмотретьПечатнуюФорму.Пометка;
	Элементы.ПоказыватьКолонтитулы.Доступность = Не Элементы.ПосмотретьПечатнуюФорму.Пометка;
	Элементы.ДействияСДокументом.Доступность = Не Элементы.ПосмотретьПечатнуюФорму.Пометка;
	Элементы.Язык.Доступность = Не Элементы.ПосмотретьПечатнуюФорму.Пометка;
	
КонецПроцедуры

&НаСервере
Процедура СформироватьПечатнуюФорму()
	
	Ссылки = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Образец);
	ОбъектыПечати = Новый СписокЗначений;
	Макет = ПодготовитьМакетДляЗаписи();
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
		ПечатнаяФорма = МодульУправлениеПечатью.СформироватьТабличныйДокумент(
			Макет, Ссылки, ОбъектыПечати, ТекущийЯзык);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура УдалитьШтампЭП(Команда)
	
	Для Каждого Область Из Элементы.ТабличныйДокумент.ПолучитьВыделенныеОбласти() Цикл
		Если СтрНачинаетсяС(Область.Имя, "ШтампЭП") Тогда
			Область.Имя = "";
			#Если ВебКлиент Тогда
				// Требуется для обновления отображения
				Область.Защита = Область.Защита;
			#КонецЕсли
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Процедура УдалитьМакетНаТекущемЯзыке()
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
		МодульУправлениеПечатью.УдалитьМакет(ИдентификаторМакета, ТекущийЯзык);
	КонецЕсли;
	
	ЗагрузитьТабличныйДокументИзМетаданных(ТекущийЯзык);
	Если ЭтоПечатнаяФорма Тогда
		ЗаполнитьТабличныйДокумент(ТабличныйДокумент, ПрочитатьМакет());
	КонецЕсли;
	
	Модифицированность = Ложь;
	
	Если Не ЗначениеЗаполнено(ТекущийЯзык) Или ТекущийЯзык = ОбщегоНазначения.КодОсновногоЯзыка() Тогда
		Возврат;
	КонецЕсли;
	
	МенюЯзык = Элементы.Язык;
	ДобавляемыеЯзыки = Элементы.ДобавляемыеЯзыки;
	ЯзыкУдаляемойФормы = ТекущийЯзык;
	ТекущийЯзык = ОбщегоНазначения.КодОсновногоЯзыка();
	Для Каждого КнопкаЯзыка Из МенюЯзык.ПодчиненныеЭлементы Цикл
		Если СтрЗаканчиваетсяНа(КнопкаЯзыка.Имя, ЯзыкУдаляемойФормы) Тогда
			КнопкаЯзыка.Пометка = Ложь;
			КнопкаЯзыка.Видимость = Ложь;
		КонецЕсли;
		
		Если СтрЗаканчиваетсяНа(КнопкаЯзыка.Имя, ТекущийЯзык) Тогда
			КнопкаЯзыка.Пометка = Истина;
		КонецЕсли;
	КонецЦикла;
	
	Для Каждого КнопкаДобавляемогоЯзыка Из ДобавляемыеЯзыки.ПодчиненныеЭлементы Цикл
		Если СтрЗаканчиваетсяНа(КнопкаДобавляемогоЯзыка.Имя, ЯзыкУдаляемойФормы) Тогда
			КнопкаДобавляемогоЯзыка.Видимость = Истина;
		КонецЕсли;
	КонецЦикла;
	
	Элементы.Язык.Заголовок = Элементы["Язык_"+ТекущийЯзык].Заголовок;
	
КонецПроцедуры

&НаКлиенте
Процедура ПродолжитьСохранениеВФайл(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
	
	Если ВыбранныеФайлы = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ПолноеИмяФайла = ВыбранныеФайлы[0];
	
	ОчиститьПодсветку();
	Макет = ПодготовитьМакетДляЗаписи(Ложь);
	Макет.Записать(ПолноеИмяФайла);
	
КонецПроцедуры

&НаКлиенте
Процедура ПродолжитьЗагрузкуИзФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
	
	Если ВыбранныеФайлы = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ПолноеИмяФайла = ВыбранныеФайлы[0];
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ПродолжитьЗагрузкуИзФайлаПослеПолученияДанных", ЭтотОбъект);
	НачатьСозданиеДвоичныхДанныхИзФайла(ОписаниеОповещения, ПолноеИмяФайла);
КонецПроцедуры

&НаКлиенте
Процедура ПродолжитьЗагрузкуИзФайлаПослеПолученияДанных(ДвоичныеДанные, ДополнительныеПараметры) Экспорт
	
	ЗаполнитьТабличныйДокумент(ТабличныйДокумент, ПрочитатьМакет(ДвоичныеДанные));
	Модифицированность = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьТекстВОбластиЯчеек()
	
	ТекущаяОбласть = ТабличныйДокумент.ТекущаяОбласть;
	Если ТекущаяОбласть = Неопределено Или ТипЗнч(ТекущаяОбласть) <> Тип("ОбластьЯчеекТабличногоДокумента") Тогда
		Возврат;
	КонецЕсли;
	
	Модифицированность = Истина;
	
	Если ТекущаяОбласть.ТипОбласти = ТипОбластиЯчеекТабличногоДокумента.Прямоугольник Тогда
		ТекущаяОбласть.Текст = ТекущееЗначение;
	ИначеЕсли ТекущаяОбласть.ТипОбласти = ТипОбластиЯчеекТабличногоДокумента.Строки Тогда
		ТекущаяОбласть.Имя = "";
		
		Область = ТабличныйДокумент.Область(ТекущаяОбласть.Верх, 1, ТекущаяОбласть.Верх, 1);
		Если Область.Текст = "" Тогда
			Область.Текст = "";
		КонецЕсли;
		
		ТекущаяОбласть.ПараметрРасшифровки = ТекущееЗначение;
		
		Если ЗначениеЗаполнено(ТекущееЗначение) Тогда
			ТекущаяОбласть.Имя = ПодобратьИмяОбласти("Условие_");
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПриВыбореИмениМакета(НовоеИмяМакета, ДополнительныеПараметры) Экспорт
	
	Если НовоеИмяМакета = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ИмяДокумента <> НовоеИмяМакета Тогда
		Модифицированность = Истина;
	КонецЕсли;
	
	ИмяДокумента = НовоеИмяМакета;
	УстановитьЗаголовок();
	
КонецПроцедуры

#КонецОбласти

&НаКлиенте
Процедура ПриВыбореВладельцевМакета(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ИсточникиДанных.ЗагрузитьЗначения(Результат.ВыгрузитьЗначения());
	Элементы.ТекстНазначение.Заголовок = ПредставлениеИсточниковДанных(ИсточникиДанных);
	ОбновитьСписокДоступныхПолей();
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ПредставлениеИсточниковДанных(ИсточникиДанных)
	
	Значения = Новый Массив;
	Для Каждого Элемент Из ИсточникиДанных Цикл
		Значения.Добавить(Элемент.Значение);
	КонецЦикла;
	
	Результат = СтрСоединить(Значения, ", ");
	Если Не ЗначениеЗаполнено(Результат) Тогда
		Результат = "<" + НСтр("ru = 'не выбрано'") + ">";
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

&НаСервереБезКонтекста
Функция ОбъектыСКомандамиПечати()
	
	ОбъектыСКомандамиПечати = Новый СписокЗначений;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
		Для Каждого ОбъектМетаданных Из МодульУправлениеПечатью.ИсточникиКомандПечати() Цикл
			ОбъектыСКомандамиПечати.Добавить(ОбъектМетаданных.ПолноеИмя());
		КонецЦикла;
	КонецЕсли;

	Возврат ОбъектыСКомандамиПечати;
	
КонецФункции

&НаСервере
Процедура ОбновитьСписокДоступныхПолей()
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
		МодульУправлениеПечатью.ОбновитьСписокДоступныхПолей(ЭтотОбъект, 
			КоллекцииПолей(ИсточникиДанных.ВыгрузитьЗначения(), ПараметрыРедактирования()), ИмяСпискаПолей());
		
		НастроитьПолеОбразец();
		ОтметитьОбщиеПоля();
		УстановитьФорматЗначенийПоУмолчанию();
			
		Если ИсточникиДанных.Количество() > 0 Тогда
			ИсточникДанных = ИсточникиДанных[0].Значение;
			ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(ИсточникДанных);
			ПодобратьОбразец(ОбъектМетаданных);
			УстановитьПримерыЗначений();
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура НастроитьПолеОбразец()

	КоллекцияПолей = ЭтотОбъект[ИмяСпискаПолей()].ПолучитьЭлементы(); // ДанныеФормыКоллекцияЭлементовДерева
	Смещение = 0;
	Для Каждого ОписаниеПоля Из КоллекцияПолей Цикл
		Если ОписаниеПоля.ПутьКДанным = "Ссылка" Тогда
			ОписаниеПоля.Заголовок = НСтр("ru = 'Образец'");
			Если Смещение <> 0 Тогда
				Индекс = КоллекцияПолей.Индекс(ОписаниеПоля);
				КоллекцияПолей.Сдвинуть(Индекс, Смещение);
			КонецЕсли;
			Прервать;
		КонецЕсли;
		Смещение = Смещение - 1;
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Функция ОбщиеПоляИсточниковДанных()
	
	ОбщиеПоляИсточниковДанных = Новый Массив;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
		МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью");
		ОбщиеПоляИсточниковДанных = МодульУправлениеПечатью.ОбщиеПоляИсточниковДанных(ИсточникиДанных.ВыгрузитьЗначения());
	КонецЕсли;
	
	Возврат ОбщиеПоляИсточниковДанных;
	
КонецФункции

&НаСервере
Процедура ОтметитьОбщиеПоля(Знач КоллекцияПолей = Неопределено, Знач ОбщиеПоля = Неопределено)
	
	Если КоллекцияПолей = Неопределено Тогда
		КоллекцияПолей = ЭтотОбъект[ИмяСпискаПолей()];
	КонецЕсли;
	
	Если ОбщиеПоля = Неопределено Тогда
		ОбщиеПоля = ОбщиеПоляИсточниковДанных();
	КонецЕсли;
	
	Для Каждого ОписаниеПоля Из КоллекцияПолей.ПолучитьЭлементы() Цикл
		Если ОписаниеПоля.Папка И ОписаниеПоля.Поле = Новый ПолеКомпоновкиДанных("ОбщиеРеквизиты")
			Или ОписаниеПоля.ПолучитьРодителя() <> Неопределено И ОписаниеПоля.ПолучитьРодителя().Поле = Новый ПолеКомпоновкиДанных("ОбщиеРеквизиты") Тогда
			ОписаниеПоля.Общее = Истина;
			УстановитьПризнакОбщегоПоляДляПодчиненныхПолей(ОписаниеПоля);
			Продолжить;
		КонецЕсли;
		
		Если ОбщиеПоля.Найти(ОписаниеПоля.Поле) <> Неопределено Тогда
			ОписаниеПоля.Общее = Истина;
			Если Не ОписаниеПоля.Папка И Не ОписаниеПоля.Таблица Тогда
				УстановитьПризнакОбщегоПоляДляПодчиненныхПолей(ОписаниеПоля);
			КонецЕсли;
		КонецЕсли;
		Если ОписаниеПоля.Общее И (ОписаниеПоля.Папка Или ОписаниеПоля.Таблица) Тогда
			ОтметитьОбщиеПоля(ОписаниеПоля, ОбщиеПоля);
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Процедура УстановитьПризнакОбщегоПоляДляПодчиненныхПолей(КоллекцияПолей)
	
	Для Каждого ОписаниеПоля Из КоллекцияПолей.ПолучитьЭлементы() Цикл
		ОписаниеПоля.Общее = КоллекцияПолей.Общее;
		УстановитьПризнакОбщегоПоляДляПодчиненныхПолей(ОписаниеПоля);
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьДоступностьРекурсивно(Элемент, Доступность = Неопределено)
	Если Доступность = Неопределено Тогда
		Доступность = Элемент.Доступность;
	КонецЕсли;
	
	Для Каждого ПодчиненныйЭлемент Из Элемент.ПодчиненныеЭлементы Цикл
		Если ТипЗнч(ПодчиненныйЭлемент) = Тип("КнопкаФормы") И ПодчиненныйЭлемент.ИмяКоманды <> "" Тогда
			ПодчиненныйЭлемент.Доступность = Доступность;
		КонецЕсли;
		
		Если ТипЗнч(ПодчиненныйЭлемент) = Тип("ГруппаФормы") Тогда
			УстановитьДоступностьРекурсивно(ПодчиненныйЭлемент, Доступность);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

&НаСервере
Функция ПараметрыРедактирования()
	Результат = Новый Структура;
	Результат.Вставить("КлючОбъектаРедактирования", КлючОбъектаРедактирования);
	Результат.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
	Возврат Результат;
КонецФункции

#КонецОбласти
